From 901b6e84103d41a441fa0019ee915a98830010fc Mon Sep 17 00:00:00 2001 From: Paul Lesack Date: Thu, 19 Sep 2024 15:26:53 -0700 Subject: [PATCH] Deployed 9031e37 with MkDocs version: 1.5.3 --- 404.html | 24 +++++------ api_ref/index.html | 55 ++++++++++++++++---------- credits/index.html | 26 ++++++------ css/theme.css | 6 +-- faq/index.html | 26 ++++++------ index.html | 30 +++++++------- scripts/index.html | 83 +++++++++++++++++++++++---------------- search.html | 24 +++++------ search/search_index.json | 2 +- sitemap.xml.gz | Bin 127 -> 127 bytes windows/index.html | 26 ++++++------ 11 files changed, 167 insertions(+), 135 deletions(-) diff --git a/404.html b/404.html index e3c104e..5375b94 100644 --- a/404.html +++ b/404.html @@ -8,14 +8,13 @@ dataverse_utils - + - - - + + @@ -70,7 +69,7 @@
    -
  • »
  • +
@@ -111,14 +110,15 @@

404

- - - - - + + + + + diff --git a/api_ref/index.html b/api_ref/index.html index a6b6493..a7fdb7b 100644 --- a/api_ref/index.html +++ b/api_ref/index.html @@ -8,7 +8,7 @@ API reference - dataverse_utils - + - - - + + @@ -305,8 +304,8 @@
    -
  • »
  • -
  • API reference
  • +
  • +
@@ -816,7 +815,8 @@
make_tsvmake_tsv

dump_tsv
@@ -997,11 +1005,17 @@
upload_file +

label : str + OPTIONAL + If included in kwargs, this value will be used for the label

+

timeout : int + OPTIONAL + Timeout in seconds

+

override : bool OPTIONAL - If included in kwargs, this value will be used for the label - timeout = int + Ignore NOTAB (ie, NOTAB = [])

+

timeout = int OPTIONAL Timeout in seconds

@@ -1219,14 +1233,15 @@
upload_metadata - - - + + + + + diff --git a/credits/index.html b/credits/index.html index f26ead8..0b16ce7 100644 --- a/credits/index.html +++ b/credits/index.html @@ -8,7 +8,7 @@ Credits - dataverse_utils - + - - - + + @@ -79,8 +78,8 @@
    -
  • »
  • -
  • Credits
  • +
  • +
@@ -125,14 +124,15 @@

Credits - - - + + + + + diff --git a/css/theme.css b/css/theme.css index 7e03995..ad77300 100644 --- a/css/theme.css +++ b/css/theme.css @@ -6,8 +6,8 @@ * https://github.com/readthedocs/sphinx_rtd_theme */ - /* sphinx_rtd_theme version 1.0.0 | MIT license */ -html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + /* sphinx_rtd_theme version 1.2.0 | MIT license */ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} diff --git a/faq/index.html b/faq/index.html index 511bcad..3c987e3 100644 --- a/faq/index.html +++ b/faq/index.html @@ -8,7 +8,7 @@ FAQ - dataverse_utils - + - - - + + @@ -87,8 +86,8 @@
    -
  • »
  • -
  • FAQ
  • +
  • +
@@ -175,14 +174,15 @@

This

- - - - - + + + + + diff --git a/index.html b/index.html index e2a202b..7666e2e 100644 --- a/index.html +++ b/index.html @@ -8,7 +8,7 @@ dataverse_utils - + - - - + + @@ -99,8 +98,8 @@
    -
  • »
  • -
  • Overview
  • +
  • +
@@ -240,20 +239,21 @@

ldc¶<

- - - - - + + + + + diff --git a/scripts/index.html b/scripts/index.html index dda1a4e..9494b60 100644 --- a/scripts/index.html +++ b/scripts/index.html @@ -8,7 +8,7 @@ Console utilities - dataverse_utils - + - - - + + @@ -50,6 +49,10 @@
  • dv_del
  • dv_ldc_uploader +
  • dv_manifest_gen
  • @@ -99,8 +102,8 @@
      -
    • »
    • -
    • Console utilities
    • +
    • +
    @@ -154,8 +157,11 @@

    dv_ldc_uploaderImportant note

    +

    2024-09 Update

    +

    The problem listed below seems to have resolved itself by September 2024. It’s not clear whether this was a certifi issue or an issue with LDC’s certificates. In any case, if you are having problems with LDC website, use the -c switch and follow the procedure below.

    +
    +

    As of early 2023, the LDC website is not supported by certifi. You will need to manually supply a certificate chain to use the utility.

    To obtain the certificate chain (in Firefox) perform the following steps:

    1. Select Tools/Page Info
    2. @@ -196,7 +202,7 @@

      dv_manifest_genusage: dv_manifest_gen [-h] [-f FILENAME] [-t TAG] [-x] [-r] [-q QUOTE] [-a] [-m] [--version] [files ...] +
      usage: dv_manifest_gen [-h] [-f FILENAME] [-t TAG] [-x] [-r] [-q QUOTE] [-a] [-m] [-p] [--version] [files ...]
       
       Creates a file manifest in tab separated value format which can then be edited and used for file uploads to a Dataverse collection. Files can be edited to add file descriptions and
       comma-separated tags that will be automatically attached to metadata using products using the dataverse_utils library. Will dump to stdout unless -f or --filename is used. Using the
      @@ -217,6 +223,7 @@ 

      dv_manifest_gendv_pg_facet_date

      @@ -272,20 +279,19 @@

      dv_record_copyusage: dv_record_copy [-h] [-u URL] -k KEY (-c COLLECTION | -r REPLACE) [-v] pid -Record duplicator for Dataverse. This utility will download a Dataverse record And then upload the study level metadata -into a new record in a user-specified collection. Please note that this utility was built with the Abacus repository -(https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. +Record duplicator for Dataverse. This utility will download a Dataverse record And then upload the study level metadata into a new record in a user-specified collection. Please note that +this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: - pid PID of original dataverse recordseparated by spaces. eg. "LDC2012T19 LDC2011T07". Case is - ignored, so "ldc2012T19" will also work. + pid PID of original dataverse recordseparated by spaces. eg. "hdl:11272.1/AB2/NOMATH hdl:11272.1/AB2/HANDLE". Case is ignored, so "hdl:11272.1/ab2/handle" will also + work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to "https://abacus.library.ubc.ca" -k KEY, --key KEY API key -c COLLECTION, --collection COLLECTION - Short name of target Dataverse collection (eg: ldc). Defaults to "ldc" + Short name of target Dataverse collection (eg: ldc). Defaults to "statcan-public" -r REPLACE, --replace REPLACE Replace metadata data in record with this PID -v, --version Show version number and exit @@ -384,7 +390,7 @@

      dv_upload_tsvIf uploading a tsv which includes mimetypes, be aware that mimetypes for zip files will be ignored to circumvent Dataverse’s automatic unzipping feature.

      The rationale for manually specifiying mimetypes is to enable the use of previews which require a specific mimetype to function, but Dataverse does not correctly detect the type. For example, the GeoJSON file previewer requires a mimetype of application/geo+json, but the detection of this mimetype is not supported until Dataverse v5.9. By manually setting the mimetype, the previewer can be used by earlier Dataverse versions.

      Usage

      -
      usage: dv_upload_tsv [-h] -p PID -k KEY [-u URL] [-r] [-n] [-t TRUNCATE] [--version] tsv
      +
      usage: dv_upload_tsv [-h] -p PID -k KEY [-u URL] [-r] [-n] [-t TRUNCATE] [-o] [-v] tsv
       
       Uploads data sets to an *existing* Dataverse study
       from the contents of a TSV (tab separated value)
      @@ -409,18 +415,28 @@ 

      dv_upload_tsv

      Notes for Windows users

      @@ -460,14 +476,15 @@

      Notes for Windows users

    - - - - - + + + + + diff --git a/search.html b/search.html index 75ca9a4..6e7191e 100644 --- a/search.html +++ b/search.html @@ -8,14 +8,13 @@ dataverse_utils - + - - - + + @@ -70,7 +69,7 @@
    @@ -118,14 +117,15 @@

    Search Results

    - - - - - + + + + + diff --git a/search/search_index.json b/search/search_index.json index 3678027..20e6456 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Dataverse utilities \u00b6 This is a generalized set of utilities which help with managing Dataverse repositories. This has nothing to do with the Microsoft product of the same name. Despite being written as they were required, that doesn\u2019t mean they\u2019re not useful or user-friendly. With these utilities you can: Upload your data sets from a tab-separated-value spreadsheet Bulk release multiple data sets Bulk delete (unpublished) assets Quickly duplicate records Replace licences and more! Get your copy today! Source code (and this documentation) is available at the Github repository https://github.com/ubc-library-rc/dataverse_utils , and the user-friendly version of the documentation is at https://ubc-library-rc.github.io/dataverse_utils . Presumably you know this already otherwise you wouldn\u2019t be reading this. Installation \u00b6 Any installation will require the use of the command line/command prompt. The easiest installation is with pip : pip install dataverse_utils There is also a server specific version if you need to use the dv_facet_date utility. This can only be run on a server hosting a Dataverse instance, so for the vast majority of users it will be unusable. This can also be installed with pip : pip install 'dataverse_utils[server]' Note the extra quotes. You can install the server version if you want to, but it\u2019s useless without server access. Upgrading \u00b6 Just as easy as installation: pip install --upgrade dataverse_utils Other methods of installing Python packages can be found at https://packaging.python.org/tutorials/installing-packages/ . Downloading the source code \u00b6 Source code is available at https://github.com/ubc-library-rc/dataverse_utils . Working on the assumption that git is installed, you can download the whole works with: git clone https://github.com/ubc-library-rc/dataverse_utils If you have mkdocs installed, you can view the documentation in a web browser by running mkdocs from the top level directory of the downloaded source files by running mkdocs serve . The components \u00b6 Console utilities \u00b6 There are eight (8) console utilities currently available. dv_del.py : Bulk (unpublished) file deletion utility dv_ldc_uploader.py : A utility which scrapes Linguistic Data Consortium metadata from their website, converts it to Dataverse JSON and uploads it, with the possibility of including local files. As of early 2023, there is an issue which requires attaching a manually downloaded certificate chain . Don\u2019t worry, that\u2019s not as hard as it sounds. dv_manifest_gen.py : Creates a simple tab-separated value format file which can be edited and then used to upload files as well as file-level metadata. Normally files will be edited after creation, usually in a spreadsheet like Excel. dv_pg_facet_date.py : A server-based tool which updates the publication date facet and performs a study reindex. dv_record_copy.py : Copies an existing Dataverse study metadata record to a target collection, or replace a currently existing record. dv_release.py : A bulk release utility. Either releases all the unreleased studies in a Dataverse or individually if persistent identifiers are available. dv_replace_licences : Replaces the licence associated with a PID with text from a Markdown file. Also available as dv_replace_licenses for those using American English. dv_upload_tsv.py : Takes a tsv file in the format from dv_manifest_gen.py and does all the uploading and metadata entry. More information about these can be found on the console utilities page . Python package: dataverse_utils \u00b6 This package contains a variety of utility functions which, for the most part, allow uploads of files and associated metadata without having to touch the Dataverse GUI or to have complex JSON attached. For example, the upload_file requires no JSON attachments: dataverse_utils.upload_file('/path/to/file.ext', dv='https://targetdataverse.invalid' descr='A file description', tags=['Data', 'Example', 'Spam'], dirlabel=['path/to/spam'], mimetype='application/geo+json') Consult the API reference for full details. ldc \u00b6 The ldc component represents the Linguistic Data Consortium or LDC. The ldc module is designed to harvest LDC metadata from its catalogue, convert it to Dataverse JSON, then upload it to a Dataverse installation. Once the study has been created, the general dataverse_utils module can handle the file uploading. The ldc module requires the dryad2dataverse package. Because of this, it requires a tiny bit more effort, because LDC material doesn\u2019t have the required metadata. Here\u2019s snippet that shows how it works. import dataverse_utils.ldc as ldc ldc.ds.constants.DV_CONTACT_EMAIL='iamcontact@test.invalid' ldc.ds.constants.DV_CONTACT_NAME='Generic Support Email' KEY = 'IAM-YOUR-DVERSE-APIKEY' stud = 'LDC2021T02' #LDC study number a = ldc.Ldc(stud) a.fetch_record() #Data goes into the 'ldc' dataverse info = a.upload_metadata(url='https://dataverse.invalid', key=KEY, dv='ldc') hdl = info['data']['persistentId'] with open('/Users/you/tmp/testme.tsv') as fil: du.upload_from_tsv(fil, hdl=hdl,dv='https://dataverse.invalid', apikey=KEY) Note that one method uses key and the other apikey . This is what is known as ad hoc . More information is available at the API reference .","title":"Overview"},{"location":"#dataverse-utilities","text":"This is a generalized set of utilities which help with managing Dataverse repositories. This has nothing to do with the Microsoft product of the same name. Despite being written as they were required, that doesn\u2019t mean they\u2019re not useful or user-friendly. With these utilities you can: Upload your data sets from a tab-separated-value spreadsheet Bulk release multiple data sets Bulk delete (unpublished) assets Quickly duplicate records Replace licences and more! Get your copy today! Source code (and this documentation) is available at the Github repository https://github.com/ubc-library-rc/dataverse_utils , and the user-friendly version of the documentation is at https://ubc-library-rc.github.io/dataverse_utils . Presumably you know this already otherwise you wouldn\u2019t be reading this.","title":"Dataverse utilities"},{"location":"#installation","text":"Any installation will require the use of the command line/command prompt. The easiest installation is with pip : pip install dataverse_utils There is also a server specific version if you need to use the dv_facet_date utility. This can only be run on a server hosting a Dataverse instance, so for the vast majority of users it will be unusable. This can also be installed with pip : pip install 'dataverse_utils[server]' Note the extra quotes. You can install the server version if you want to, but it\u2019s useless without server access.","title":"Installation"},{"location":"#upgrading","text":"Just as easy as installation: pip install --upgrade dataverse_utils Other methods of installing Python packages can be found at https://packaging.python.org/tutorials/installing-packages/ .","title":"Upgrading"},{"location":"#downloading-the-source-code","text":"Source code is available at https://github.com/ubc-library-rc/dataverse_utils . Working on the assumption that git is installed, you can download the whole works with: git clone https://github.com/ubc-library-rc/dataverse_utils If you have mkdocs installed, you can view the documentation in a web browser by running mkdocs from the top level directory of the downloaded source files by running mkdocs serve .","title":"Downloading the source code"},{"location":"#the-components","text":"","title":"The components"},{"location":"#console-utilities","text":"There are eight (8) console utilities currently available. dv_del.py : Bulk (unpublished) file deletion utility dv_ldc_uploader.py : A utility which scrapes Linguistic Data Consortium metadata from their website, converts it to Dataverse JSON and uploads it, with the possibility of including local files. As of early 2023, there is an issue which requires attaching a manually downloaded certificate chain . Don\u2019t worry, that\u2019s not as hard as it sounds. dv_manifest_gen.py : Creates a simple tab-separated value format file which can be edited and then used to upload files as well as file-level metadata. Normally files will be edited after creation, usually in a spreadsheet like Excel. dv_pg_facet_date.py : A server-based tool which updates the publication date facet and performs a study reindex. dv_record_copy.py : Copies an existing Dataverse study metadata record to a target collection, or replace a currently existing record. dv_release.py : A bulk release utility. Either releases all the unreleased studies in a Dataverse or individually if persistent identifiers are available. dv_replace_licences : Replaces the licence associated with a PID with text from a Markdown file. Also available as dv_replace_licenses for those using American English. dv_upload_tsv.py : Takes a tsv file in the format from dv_manifest_gen.py and does all the uploading and metadata entry. More information about these can be found on the console utilities page .","title":"Console utilities"},{"location":"#python-package-dataverse_utils","text":"This package contains a variety of utility functions which, for the most part, allow uploads of files and associated metadata without having to touch the Dataverse GUI or to have complex JSON attached. For example, the upload_file requires no JSON attachments: dataverse_utils.upload_file('/path/to/file.ext', dv='https://targetdataverse.invalid' descr='A file description', tags=['Data', 'Example', 'Spam'], dirlabel=['path/to/spam'], mimetype='application/geo+json') Consult the API reference for full details.","title":"Python package: dataverse_utils"},{"location":"#ldc","text":"The ldc component represents the Linguistic Data Consortium or LDC. The ldc module is designed to harvest LDC metadata from its catalogue, convert it to Dataverse JSON, then upload it to a Dataverse installation. Once the study has been created, the general dataverse_utils module can handle the file uploading. The ldc module requires the dryad2dataverse package. Because of this, it requires a tiny bit more effort, because LDC material doesn\u2019t have the required metadata. Here\u2019s snippet that shows how it works. import dataverse_utils.ldc as ldc ldc.ds.constants.DV_CONTACT_EMAIL='iamcontact@test.invalid' ldc.ds.constants.DV_CONTACT_NAME='Generic Support Email' KEY = 'IAM-YOUR-DVERSE-APIKEY' stud = 'LDC2021T02' #LDC study number a = ldc.Ldc(stud) a.fetch_record() #Data goes into the 'ldc' dataverse info = a.upload_metadata(url='https://dataverse.invalid', key=KEY, dv='ldc') hdl = info['data']['persistentId'] with open('/Users/you/tmp/testme.tsv') as fil: du.upload_from_tsv(fil, hdl=hdl,dv='https://dataverse.invalid', apikey=KEY) Note that one method uses key and the other apikey . This is what is known as ad hoc . More information is available at the API reference .","title":"ldc"},{"location":"api_ref/","text":"API Reference \u00b6 dataverse_utils \u00b6 Generalized dataverse utilities. Note that import dataverse_utils is the equivalent of import dataverse_utils.dataverse_utils dataverse_utils.dvdata \u00b6 Dataverse studies and files Study Objects \u00b6 class Study(dict) Dataverse record. Dataverse study records are pure metadata so this is represented with a dictionary. __init__ \u00b6 def __init__(pid: str, url: str, key: str, **kwargs) pid : str Record persistent identifier: hdl or doi url : str Base URL to host Dataverse instance key : str Dataverse API key with downloader privileges get_version \u00b6 @classmethod def get_version(cls, url: str, timeout: int = 100) -> float Returns a float representing a Dataverse version number. Floating point value composed of: float(f\u2019{major_version}.{minor_verson:03d}{patch:03d}\u2019) ie, version 5.9.2 would be 5.009002 url : str URL of base Dataverse instance. eg: \u2018https://abacus.library.ubc.ca\u2019 timeout : int Request timeout in seconds set_version \u00b6 def set_version(url: str, timeout: int = 100) -> None Sets self[\u2018target_version\u2019] to appropriate integer value AND formats self[\u2018upload_json\u2019] to correct JSON format url : str URL of target Dataverse instance timeout : int request timeout in seconds fix_licence \u00b6 def fix_licence() -> None With Dataverse v5.10+, a licence type of \u2018NONE\u2019 is now forbidden. Now, as per https://guides.dataverse.org/en/5.14/api/sword.html ?highlight=invalid%20license , non-standard licences may be replaced with None. This function edits the same Study object in place , so returns nothing. production_location \u00b6 def production_location() -> None Changes \u201cmultiple\u201d to True where typeName == \u2018productionPlace\u2019 in Study[\u2018upload_json\u2019] Changes are done in place . This change came into effect with Dataverse v5.13 File Objects \u00b6 class File(dict) Class representing a file on a Dataverse instance __init__ \u00b6 def __init__(url: str, key: str, **kwargs) url : str Base URL to host Dataverse instance key : str Dataverse API key with downloader privileges id : int or str File identifier; can be a file ID or PID args : list kwargs : dict To initialize correctly, pass a value from Study[\u2018file_info\u2019]. Eg: File(\u2018https://test.invalid\u2019, \u2018ABC123\u2019, **Study_instance[\u2018file_info\u2019][0]) download_file \u00b6 def download_file() Downloads the file to a temporary location. Data will be in the ORIGINAL format, not Dataverse-processed TSVs del_tempfile \u00b6 def del_tempfile() Delete tempfile if it exists produce_digest \u00b6 def produce_digest(prot: str = 'md5', blocksize: int = 2**16) -> str Returns hex digest for object fname : str Path to a file object prot : str Hash type. Supported hashes: 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'blake2b', 'blake2s', 'md5'. Default: 'md5' blocksize : int Read block size in bytes verify \u00b6 def verify() -> None Compares checksum with stated checksum dataverse_utils.scripts.dv_record_copy \u00b6 Copies a dataverse record to collection OR copies a record to an existing PID. That way all you have to do is edit a few fields in the GUI instead of painfully editing JSON or painfully using the Dataverse GUI. parsley \u00b6 def parsley() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser main \u00b6 def main() You know what this does dataverse_utils.scripts.dv_study_migrator \u00b6 Copies an entire record and migrates it including the data parsley \u00b6 def parsley() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser upload_file_to_target \u00b6 def upload_file_to_target(indict: dict, pid, source_url, source_key, target_url, target_key) Uploads a single file with metadata to a dataverse record remove_target_files \u00b6 def remove_target_files(record: dataverse_utils.dvdata.Study, timeout: int = 100) Removes all files from a dataverse record. record: dataverse_utils.dvdata.Study timeout: int Timeout in seconds main \u00b6 def main() Run this, obviously dataverse_utils.scripts.dv_ldc_uploader \u00b6 Auto download/upload LDC metadata and files. python3 uploadme.py LDC20201S01 . . . LDC2021T21 apikey parse \u00b6 def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser upload_meta \u00b6 def upload_meta(ldccat: str, url: str, key: str, dvs: str, verbose: bool = False, certchain: str = None) -> str Uploads metadata to target dataverse collection. Returns persistentId. ldccat : str Linguistic Data Consortium catalogue number url : str URL to base instance of Dataverse installation key : str API key dvs : str Target Dataverse collection short name certchain : str Path to LDC .PEM certificate chain main \u00b6 def main() -> None Uploads metadata and data to Dataverse collection/study respectively dataverse_utils.scripts.dv_pg_facet_date \u00b6 Reads the date from a Dataverse study and forces the facet sidebar to use that date by manually updating the Dataverse Postgres database. This must be run on the server that hosts a Dataverse installation, and the user must supply, at a minimum, the database password and a persistent ID to be read, as well as a date type. Requires two non-standard python libraries: psycopg2 (use psycopg2-binary to avoid installing from source) and requests. Psycopg2 is not part of the requirements for dataverse_utils because it is only used for the server portion of these utilities, and hence useless for them. parsely \u00b6 def parsely() -> argparse.ArgumentParser Command line argument parser parse_dtype \u00b6 def parse_dtype(dtype) -> str Returns correctly formatted date type string for Dataverse API dtype : str One of the allowable values from the parser write_old \u00b6 def write_old(data) -> None Writes older data to a tsv file. Assumes 4 values per item: id, authority, identifier, publicationdate. publicationdate is assumed to be a datetime.datetime instance. \u00b6 Arguments : data : list Postqres query output list (ie, data = cursor.fetchall()) write_sql \u00b6 def write_sql(data) -> None Write SQL to file get_datetime \u00b6 def get_datetime(datestr) -> (datetime.datetime, str) Return datetime from poorly formatted Dataverse dates string datestr : str Dataverse date returned by API fetch_date_api \u00b6 def fetch_date_api(url, key, pid, dtype) -> str Returns the requested date string from the Dataverse study record url : str Base URL of Dataverse installation key :str API key for Dataverse user pid : str Persistent identifier for Dataverse study dtype : str Date type required reindex \u00b6 def reindex(pid) -> dict Reindexes study in place. Localhost access only. pid : str PersistentId for Dataverse study main \u00b6 def main() The heart of the application dataverse_utils.scripts.dv_release \u00b6 Bulk release script for Dataverse. This is almost identical to the dryad2dataverse bulk releaser except that the defaults are changed to https://abacus.library.ubc.ca argp \u00b6 def argp() Parses the arguments from the command line. Returns arparse.ArgumentParser Dverse Objects \u00b6 class Dverse() An object representing a Dataverse installation __init__ \u00b6 def __init__(dvurl, apikey, dvs) Intializes Dataverse installation object. Arguments : dvurl : str. URL to base Dataverse installation (eg. \u2018https://abacus.library.ubc.ca\u2019) apikey : str. API key for Dataverse user dv : str. Short name of target Dataverse collection (eg. \u2018statcan\u2019) study_list \u00b6 @property def study_list() -> list Returns a list of all studies (published or not) in the Dataverse collection unreleased \u00b6 @property def unreleased(all_stud: list = None) -> list Finds only unreleased studies from a list of studies Arguments : all_stud : list. List of Dataverse studies. Defaults to output of Dverse.get_study_list() Study Objects \u00b6 class Study() Instance representing a Dataverse study __init__ \u00b6 def __init__(**kwargs) :kwarg dvurl: str. Base URL for Dataverse instance :kwarg apikey: str. API key for Dataverse user :kwarg pid: str. Persistent identifier for study :kwarg stime: int. Time between file lock checks. Default 10 :kwarg verbose: Verbose output. Default False status_ok \u00b6 def status_ok() Checks to see if study has a lock. Returns True if OK to continue, else False. release_me \u00b6 def release_me(interactive=False) Releases study and waits until it\u2019s unlocked before returning to the function main \u00b6 def main() The primary function. Will release all unreleased studies in the the target Dataverse collection, or selected studies as required. dataverse_utils.scripts.dv_del \u00b6 Dataverse Bulk Deleter Deletes unpublished studies at the command line delstudy \u00b6 def delstudy(dvurl, key, pid) Deletes Dataverse study dvurl : str Dataverse installation base URL key : str Dataverse user API key pid : str Dataverse collection study persistent identifier conf \u00b6 def conf(tex) Confirmation dialogue checker. Returns true if \u201cY\u201d or \u201cy\u201d getsize \u00b6 def getsize(dvurl, pid, key) Returns size of Dataverse study. Mostly here for debugging. dvurl : str Dataverse installation base URL pid : str Dataverse collection study persistent identifier key : str Dataverse user API key parsley \u00b6 def parsley() -> argparse.ArgumentParser Argument parser as separate function main \u00b6 def main() Command line bulk deleter dataverse_utils.scripts.dv_replace_licence \u00b6 Replace all licence in a study with one read from an external markdown file. This requires using a different API, the \u201csemantic metadata api\u201d https://guides.dataverse.org/en/5.6/developers/ dataset-semantic-metadata-api.html parsley \u00b6 def parsley() -> argparse.ArgumentParser() parse the command line replace_licence \u00b6 def replace_licence(hdl, lic, key, url='https://abacus.library.ubc.ca') Replace the licence for a dataverse study with persistent ID hdl. hdl : str Dataverse persistent ID lic : str Licence text in Markdown format key : str Dataverse API key url : str Dataverse installation base URL republish \u00b6 def republish(hdl, key, url='https://abacus.library.ubc.ca') Republish study without updating version hdl : str Persistent Id key : str Dataverse API key url : str Dataverse installation base URL print_stat \u00b6 def print_stat(rjson) Prints error status to stdout main \u00b6 def main() Main script function dataverse_utils.scripts.dv_upload_tsv \u00b6 Uploads data sets to a dataverse installation from the contents of a TSV (tab separated value) file. Metadata, file tags, paths, etc are all read from the TSV. parse \u00b6 def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser main \u00b6 def main() -> None Uploads data to an already existing Dataverse study dataverse_utils.scripts.dv_manifest_gen \u00b6 Creates a file manifest in tab separated value format which can be used with other dataverse_util library utilities and functions to upload files complete with metadata. parse \u00b6 def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser quotype \u00b6 def quotype(quote: str) -> int Parse quotation type for csv parser. returns csv quote constant. main \u00b6 def main() -> None The main function call dataverse_utils.dataverse_utils \u00b6 A collection of Dataverse utilities for file and metadata manipulation DvGeneralUploadError Objects \u00b6 class DvGeneralUploadError(Exception) Raised on non-200 URL response Md5Error Objects \u00b6 class Md5Error(Exception) Raised on md5 mismatch make_tsv \u00b6 def make_tsv(start_dir, in_list=None, def_tag='Data', inc_header=True, mime=False, quotype=csv.QUOTE_MINIMAL) -> str Recurses the tree for files and produces tsv output with with headers \u2018file\u2019, \u2018description\u2019, \u2018tags\u2019. The \u2018description\u2019 is the filename without an extension. Returns tsv as string. Arguments : start_dir : str Path to start directory in_list : list Input file list. Defaults to recursive walk of current directory. def_tag : str Default Dataverse tag (eg, Data, Documentation, etc) Separate tags with a comma: eg. (\u2018Data, 2016\u2019) inc_header : bool Include header row mime : bool Include automatically determined mimetype quotype - int integer value or csv quote type. Default = csv.QUOTE_MINIMAL Acceptable values: csv.QUOTE_MINIMAL / 0 csv.QUOTE_ALL / 1 csv.QUOTE_NONNUMERIC / 2 csv.QUOTE_NONE / 3 dump_tsv \u00b6 def dump_tsv(start_dir, filename, in_list=None, **kwargs) Dumps output of make_tsv manifest to a file. Arguments : start_dir : str Path to start directory in_list : list List of files for which to create manifest entries. Will default to recursive directory crawl OPTIONAL KEYWORD ARGUMENTS def_tag : str Default Dataverse tag (eg, Data, Documentation, etc) Separate tags with an easily splitable character: eg. (\u2018Data, 2016\u2019) - Default - \u2018Data\u2019 inc_header : bool Include header for tsv. Default : True quotype - int integer value or csv quote type. Default : csv.QUOTE_MINIMAL Acceptable values: csv.QUOTE_MINIMAL / 0 csv.QUOTE_ALL / 1 csv.QUOTE_NONNUMERIC / 2 csv.QUOTE_NONE / 3 file_path \u00b6 def file_path(fpath, trunc='') -> str Create relative file path from full path string file_path(\u2018/tmp/Data/2011/excelfile.xlsx\u2019, \u2018/tmp/\u2019) \u2018Data/2011\u2019 file_path(\u2018/tmp/Data/2011/excelfile.xlsx\u2019, \u2018/tmp\u2019) \u2018Data/2011\u2019 Arguments : fpath : str File location (ie, complete path) trunc : str Leftmost portion of path to remove check_lock \u00b6 def check_lock(dv_url, study, apikey) -> bool Checks study lock status; returns True if locked. Arguments : dvurl : str URL of Dataverse installation study - str Persistent ID of study apikey : str API key for user force_notab_unlock \u00b6 def force_notab_unlock(study, dv_url, fid, apikey, try_uningest=True) -> int Forcibly unlocks and uningests to prevent tabular file processing. Required if mime and filename spoofing is not sufficient. Returns 0 if unlocked, file id if locked (and then unlocked). Arguments : study : str Persistent indentifer of study dv_url : str URL to base Dataverse installation fid : str File ID for file object apikey : str API key for user try_uningest : bool Try to uningest the file that was locked. - Default - True uningest_file \u00b6 def uningest_file(dv_url, fid, apikey, study='n/a') Tries to uningest a file that has been ingested. Requires superuser API key. Arguments : dv_url : str URL to base Dataverse installation fid : int or str File ID of file to uningest apikey : str API key for superuser study : str Optional handle parameter for log messages upload_file \u00b6 def upload_file(fpath, hdl, **kwargs) Uploads file to Dataverse study and sets file metadata and tags. Arguments : fpath : str file location (ie, complete path) hdl : str Dataverse persistent ID for study (handle or DOI) kwargs : dict other parameters. Acceptable keywords and contents are: dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user descr : str OPTIONAL file description md5 : str OPTIONAL md5sum for file checking tags : list OPTIONAL list of text file tags. Eg [\u2018Data\u2019, \u2018June 2020\u2019] dirlabel : str OPTIONAL Unix style relative pathname for Dataverse file path: eg: path/to/file/ nowait : bool OPTIONAL Force a file unlock and uningest instead of waiting for processing to finish trunc : str OPTIONAL Leftmost portion of path to remove rest : bool OPTIONAL Restrict file. Defaults to false unless True supplied mimetype : str OPTIONAL Mimetype of file. Useful if using File Previewers. Mimetype for zip files (application/zip) will be ignored to circumvent Dataverse\u2019s automatic unzipping function. label : str OPTIONAL If included in kwargs, this value will be used for the label timeout = int OPTIONAL Timeout in seconds restrict_file \u00b6 def restrict_file(**kwargs) Restrict file in Dataverse study. Arguments : kwargs : dict other parameters. Acceptable keywords and contents are: One of pid or fid is required pid : str file persistent ID fid : str file database ID dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user rest : bool On True, restrict. Default True upload_from_tsv \u00b6 def upload_from_tsv(fil, hdl, **kwargs) Utility for bulk uploading. Assumes fil is formatted as tsv with headers \u2018file\u2019, \u2018description\u2019, \u2018tags\u2019. \u2018tags\u2019 field will be split on commas. Arguments : fil : filelike object Open file object or io.IOStream() hdl : str Dataverse persistent ID for study (handle or DOI) trunc : str Leftmost portion of Dataverse study file path to remove. - eg - trunc =\u2019/home/user/\u2019 if the tsv field is \u2018/home/user/Data/ASCII\u2019 would set the path for that line of the tsv to \u2018Data/ASCII\u2019. Defaults to None. kwargs : dict other parameters. Acceptable keywords and contents are: dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user rest : bool On True, restrict access. Default False dataverse_utils.ldc \u00b6 Creates dataverse JSON from Linguistic Data Consortium website page. Ldc Objects \u00b6 class Ldc(ds.Serializer) An LDC item (eg, LDC2021T01) __init__ \u00b6 def __init__(ldc, cert=None) Returns a dict with keys created from an LDC catalogue web page. Arguments : ldc : str Linguistic Consortium Catalogue Number (eg. \u2018LDC2015T05\u2019. This is what forms the last part of the LDC catalogue URL. cert : str Path to certificate chain; LDC has had a problem with intermediate certificates, so you can download the chain with a browser and supply a path to the .pem with this parameter ldcJson \u00b6 @property def ldcJson() Returns a JSON based on the LDC web page scraping dryadJson \u00b6 @property def dryadJson() LDC metadata in Dryad JSON format dvJson \u00b6 @property def dvJson() LDC metadata in Dataverse JSON format embargo \u00b6 @property def embargo() Boolean indicating embargo status fileJson \u00b6 @property def fileJson(timeout=45) Returns False: No attached files possible at LDC files \u00b6 @property def files() Returns None. No files possible fetch_record \u00b6 def fetch_record(url=None, timeout=45) Downloads record from LDC website make_ldc_json \u00b6 def make_ldc_json() Returns a dict with keys created from an LDC catalogue web page. name_parser \u00b6 @staticmethod def name_parser(name) Returns lastName/firstName JSON snippet from name Arguments : name : str A name make_dryad_json \u00b6 def make_dryad_json(ldc=None) Creates a Dryad-style dict from an LDC dictionary Arguments : ldc : dict Dictionary containing LDC data. Defaults to self.ldcJson find_block_index \u00b6 @staticmethod def find_block_index(dvjson, key) Finds the index number of an item in Dataverse\u2019s idiotic JSON list Arguments : dvjson : dict Dataverse JSON key : str key for which to find list index make_dv_json \u00b6 def make_dv_json(ldc=None) Returns complete Dataverse JSON Arguments : ldc : dict LDC dictionary. Defaults to self.ldcJson upload_metadata \u00b6 def upload_metadata(**kwargs) -> dict Uploads metadata to dataverse Returns json from connection attempt. Arguments : kwargs: url : str base url to Dataverse key : str api key dv : str Dataverse to which it is being uploaded","title":"API reference"},{"location":"api_ref/#api-reference","text":"","title":"API Reference"},{"location":"api_ref/#dataverse_utils","text":"Generalized dataverse utilities. Note that import dataverse_utils is the equivalent of import dataverse_utils.dataverse_utils","title":"dataverse_utils"},{"location":"api_ref/#dataverse_utilsdvdata","text":"Dataverse studies and files","title":"dataverse_utils.dvdata"},{"location":"api_ref/#study-objects","text":"class Study(dict) Dataverse record. Dataverse study records are pure metadata so this is represented with a dictionary.","title":"Study Objects"},{"location":"api_ref/#__init__","text":"def __init__(pid: str, url: str, key: str, **kwargs) pid : str Record persistent identifier: hdl or doi url : str Base URL to host Dataverse instance key : str Dataverse API key with downloader privileges","title":"__init__"},{"location":"api_ref/#get_version","text":"@classmethod def get_version(cls, url: str, timeout: int = 100) -> float Returns a float representing a Dataverse version number. Floating point value composed of: float(f\u2019{major_version}.{minor_verson:03d}{patch:03d}\u2019) ie, version 5.9.2 would be 5.009002 url : str URL of base Dataverse instance. eg: \u2018https://abacus.library.ubc.ca\u2019 timeout : int Request timeout in seconds","title":"get_version"},{"location":"api_ref/#set_version","text":"def set_version(url: str, timeout: int = 100) -> None Sets self[\u2018target_version\u2019] to appropriate integer value AND formats self[\u2018upload_json\u2019] to correct JSON format url : str URL of target Dataverse instance timeout : int request timeout in seconds","title":"set_version"},{"location":"api_ref/#fix_licence","text":"def fix_licence() -> None With Dataverse v5.10+, a licence type of \u2018NONE\u2019 is now forbidden. Now, as per https://guides.dataverse.org/en/5.14/api/sword.html ?highlight=invalid%20license , non-standard licences may be replaced with None. This function edits the same Study object in place , so returns nothing.","title":"fix_licence"},{"location":"api_ref/#production_location","text":"def production_location() -> None Changes \u201cmultiple\u201d to True where typeName == \u2018productionPlace\u2019 in Study[\u2018upload_json\u2019] Changes are done in place . This change came into effect with Dataverse v5.13","title":"production_location"},{"location":"api_ref/#file-objects","text":"class File(dict) Class representing a file on a Dataverse instance","title":"File Objects"},{"location":"api_ref/#__init___1","text":"def __init__(url: str, key: str, **kwargs) url : str Base URL to host Dataverse instance key : str Dataverse API key with downloader privileges id : int or str File identifier; can be a file ID or PID args : list kwargs : dict To initialize correctly, pass a value from Study[\u2018file_info\u2019]. Eg: File(\u2018https://test.invalid\u2019, \u2018ABC123\u2019, **Study_instance[\u2018file_info\u2019][0])","title":"__init__"},{"location":"api_ref/#download_file","text":"def download_file() Downloads the file to a temporary location. Data will be in the ORIGINAL format, not Dataverse-processed TSVs","title":"download_file"},{"location":"api_ref/#del_tempfile","text":"def del_tempfile() Delete tempfile if it exists","title":"del_tempfile"},{"location":"api_ref/#produce_digest","text":"def produce_digest(prot: str = 'md5', blocksize: int = 2**16) -> str Returns hex digest for object fname : str Path to a file object prot : str Hash type. Supported hashes: 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'blake2b', 'blake2s', 'md5'. Default: 'md5' blocksize : int Read block size in bytes","title":"produce_digest"},{"location":"api_ref/#verify","text":"def verify() -> None Compares checksum with stated checksum","title":"verify"},{"location":"api_ref/#dataverse_utilsscriptsdv_record_copy","text":"Copies a dataverse record to collection OR copies a record to an existing PID. That way all you have to do is edit a few fields in the GUI instead of painfully editing JSON or painfully using the Dataverse GUI.","title":"dataverse_utils.scripts.dv_record_copy"},{"location":"api_ref/#parsley","text":"def parsley() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parsley"},{"location":"api_ref/#main","text":"def main() You know what this does","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_study_migrator","text":"Copies an entire record and migrates it including the data","title":"dataverse_utils.scripts.dv_study_migrator"},{"location":"api_ref/#parsley_1","text":"def parsley() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parsley"},{"location":"api_ref/#upload_file_to_target","text":"def upload_file_to_target(indict: dict, pid, source_url, source_key, target_url, target_key) Uploads a single file with metadata to a dataverse record","title":"upload_file_to_target"},{"location":"api_ref/#remove_target_files","text":"def remove_target_files(record: dataverse_utils.dvdata.Study, timeout: int = 100) Removes all files from a dataverse record. record: dataverse_utils.dvdata.Study timeout: int Timeout in seconds","title":"remove_target_files"},{"location":"api_ref/#main_1","text":"def main() Run this, obviously","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_ldc_uploader","text":"Auto download/upload LDC metadata and files. python3 uploadme.py LDC20201S01 . . . LDC2021T21 apikey","title":"dataverse_utils.scripts.dv_ldc_uploader"},{"location":"api_ref/#parse","text":"def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parse"},{"location":"api_ref/#upload_meta","text":"def upload_meta(ldccat: str, url: str, key: str, dvs: str, verbose: bool = False, certchain: str = None) -> str Uploads metadata to target dataverse collection. Returns persistentId. ldccat : str Linguistic Data Consortium catalogue number url : str URL to base instance of Dataverse installation key : str API key dvs : str Target Dataverse collection short name certchain : str Path to LDC .PEM certificate chain","title":"upload_meta"},{"location":"api_ref/#main_2","text":"def main() -> None Uploads metadata and data to Dataverse collection/study respectively","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_pg_facet_date","text":"Reads the date from a Dataverse study and forces the facet sidebar to use that date by manually updating the Dataverse Postgres database. This must be run on the server that hosts a Dataverse installation, and the user must supply, at a minimum, the database password and a persistent ID to be read, as well as a date type. Requires two non-standard python libraries: psycopg2 (use psycopg2-binary to avoid installing from source) and requests. Psycopg2 is not part of the requirements for dataverse_utils because it is only used for the server portion of these utilities, and hence useless for them.","title":"dataverse_utils.scripts.dv_pg_facet_date"},{"location":"api_ref/#parsely","text":"def parsely() -> argparse.ArgumentParser Command line argument parser","title":"parsely"},{"location":"api_ref/#parse_dtype","text":"def parse_dtype(dtype) -> str Returns correctly formatted date type string for Dataverse API dtype : str One of the allowable values from the parser","title":"parse_dtype"},{"location":"api_ref/#write_old","text":"def write_old(data) -> None Writes older data to a tsv file. Assumes 4 values per item: id, authority, identifier, publicationdate.","title":"write_old"},{"location":"api_ref/#publicationdate-is-assumed-to-be-a-datetimedatetime-instance","text":"Arguments : data : list Postqres query output list (ie, data = cursor.fetchall())","title":"publicationdate is assumed to be a datetime.datetime instance."},{"location":"api_ref/#write_sql","text":"def write_sql(data) -> None Write SQL to file","title":"write_sql"},{"location":"api_ref/#get_datetime","text":"def get_datetime(datestr) -> (datetime.datetime, str) Return datetime from poorly formatted Dataverse dates string datestr : str Dataverse date returned by API","title":"get_datetime"},{"location":"api_ref/#fetch_date_api","text":"def fetch_date_api(url, key, pid, dtype) -> str Returns the requested date string from the Dataverse study record url : str Base URL of Dataverse installation key :str API key for Dataverse user pid : str Persistent identifier for Dataverse study dtype : str Date type required","title":"fetch_date_api"},{"location":"api_ref/#reindex","text":"def reindex(pid) -> dict Reindexes study in place. Localhost access only. pid : str PersistentId for Dataverse study","title":"reindex"},{"location":"api_ref/#main_3","text":"def main() The heart of the application","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_release","text":"Bulk release script for Dataverse. This is almost identical to the dryad2dataverse bulk releaser except that the defaults are changed to https://abacus.library.ubc.ca","title":"dataverse_utils.scripts.dv_release"},{"location":"api_ref/#argp","text":"def argp() Parses the arguments from the command line. Returns arparse.ArgumentParser","title":"argp"},{"location":"api_ref/#dverse-objects","text":"class Dverse() An object representing a Dataverse installation","title":"Dverse Objects"},{"location":"api_ref/#__init___2","text":"def __init__(dvurl, apikey, dvs) Intializes Dataverse installation object. Arguments : dvurl : str. URL to base Dataverse installation (eg. \u2018https://abacus.library.ubc.ca\u2019) apikey : str. API key for Dataverse user dv : str. Short name of target Dataverse collection (eg. \u2018statcan\u2019)","title":"__init__"},{"location":"api_ref/#study_list","text":"@property def study_list() -> list Returns a list of all studies (published or not) in the Dataverse collection","title":"study_list"},{"location":"api_ref/#unreleased","text":"@property def unreleased(all_stud: list = None) -> list Finds only unreleased studies from a list of studies Arguments : all_stud : list. List of Dataverse studies. Defaults to output of Dverse.get_study_list()","title":"unreleased"},{"location":"api_ref/#study-objects_1","text":"class Study() Instance representing a Dataverse study","title":"Study Objects"},{"location":"api_ref/#__init___3","text":"def __init__(**kwargs) :kwarg dvurl: str. Base URL for Dataverse instance :kwarg apikey: str. API key for Dataverse user :kwarg pid: str. Persistent identifier for study :kwarg stime: int. Time between file lock checks. Default 10 :kwarg verbose: Verbose output. Default False","title":"__init__"},{"location":"api_ref/#status_ok","text":"def status_ok() Checks to see if study has a lock. Returns True if OK to continue, else False.","title":"status_ok"},{"location":"api_ref/#release_me","text":"def release_me(interactive=False) Releases study and waits until it\u2019s unlocked before returning to the function","title":"release_me"},{"location":"api_ref/#main_4","text":"def main() The primary function. Will release all unreleased studies in the the target Dataverse collection, or selected studies as required.","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_del","text":"Dataverse Bulk Deleter Deletes unpublished studies at the command line","title":"dataverse_utils.scripts.dv_del"},{"location":"api_ref/#delstudy","text":"def delstudy(dvurl, key, pid) Deletes Dataverse study dvurl : str Dataverse installation base URL key : str Dataverse user API key pid : str Dataverse collection study persistent identifier","title":"delstudy"},{"location":"api_ref/#conf","text":"def conf(tex) Confirmation dialogue checker. Returns true if \u201cY\u201d or \u201cy\u201d","title":"conf"},{"location":"api_ref/#getsize","text":"def getsize(dvurl, pid, key) Returns size of Dataverse study. Mostly here for debugging. dvurl : str Dataverse installation base URL pid : str Dataverse collection study persistent identifier key : str Dataverse user API key","title":"getsize"},{"location":"api_ref/#parsley_2","text":"def parsley() -> argparse.ArgumentParser Argument parser as separate function","title":"parsley"},{"location":"api_ref/#main_5","text":"def main() Command line bulk deleter","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_replace_licence","text":"Replace all licence in a study with one read from an external markdown file. This requires using a different API, the \u201csemantic metadata api\u201d https://guides.dataverse.org/en/5.6/developers/ dataset-semantic-metadata-api.html","title":"dataverse_utils.scripts.dv_replace_licence"},{"location":"api_ref/#parsley_3","text":"def parsley() -> argparse.ArgumentParser() parse the command line","title":"parsley"},{"location":"api_ref/#replace_licence","text":"def replace_licence(hdl, lic, key, url='https://abacus.library.ubc.ca') Replace the licence for a dataverse study with persistent ID hdl. hdl : str Dataverse persistent ID lic : str Licence text in Markdown format key : str Dataverse API key url : str Dataverse installation base URL","title":"replace_licence"},{"location":"api_ref/#republish","text":"def republish(hdl, key, url='https://abacus.library.ubc.ca') Republish study without updating version hdl : str Persistent Id key : str Dataverse API key url : str Dataverse installation base URL","title":"republish"},{"location":"api_ref/#print_stat","text":"def print_stat(rjson) Prints error status to stdout","title":"print_stat"},{"location":"api_ref/#main_6","text":"def main() Main script function","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_upload_tsv","text":"Uploads data sets to a dataverse installation from the contents of a TSV (tab separated value) file. Metadata, file tags, paths, etc are all read from the TSV.","title":"dataverse_utils.scripts.dv_upload_tsv"},{"location":"api_ref/#parse_1","text":"def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parse"},{"location":"api_ref/#main_7","text":"def main() -> None Uploads data to an already existing Dataverse study","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_manifest_gen","text":"Creates a file manifest in tab separated value format which can be used with other dataverse_util library utilities and functions to upload files complete with metadata.","title":"dataverse_utils.scripts.dv_manifest_gen"},{"location":"api_ref/#parse_2","text":"def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parse"},{"location":"api_ref/#quotype","text":"def quotype(quote: str) -> int Parse quotation type for csv parser. returns csv quote constant.","title":"quotype"},{"location":"api_ref/#main_8","text":"def main() -> None The main function call","title":"main"},{"location":"api_ref/#dataverse_utilsdataverse_utils","text":"A collection of Dataverse utilities for file and metadata manipulation","title":"dataverse_utils.dataverse_utils"},{"location":"api_ref/#dvgeneraluploaderror-objects","text":"class DvGeneralUploadError(Exception) Raised on non-200 URL response","title":"DvGeneralUploadError Objects"},{"location":"api_ref/#md5error-objects","text":"class Md5Error(Exception) Raised on md5 mismatch","title":"Md5Error Objects"},{"location":"api_ref/#make_tsv","text":"def make_tsv(start_dir, in_list=None, def_tag='Data', inc_header=True, mime=False, quotype=csv.QUOTE_MINIMAL) -> str Recurses the tree for files and produces tsv output with with headers \u2018file\u2019, \u2018description\u2019, \u2018tags\u2019. The \u2018description\u2019 is the filename without an extension. Returns tsv as string. Arguments : start_dir : str Path to start directory in_list : list Input file list. Defaults to recursive walk of current directory. def_tag : str Default Dataverse tag (eg, Data, Documentation, etc) Separate tags with a comma: eg. (\u2018Data, 2016\u2019) inc_header : bool Include header row mime : bool Include automatically determined mimetype quotype - int integer value or csv quote type. Default = csv.QUOTE_MINIMAL Acceptable values: csv.QUOTE_MINIMAL / 0 csv.QUOTE_ALL / 1 csv.QUOTE_NONNUMERIC / 2 csv.QUOTE_NONE / 3","title":"make_tsv"},{"location":"api_ref/#dump_tsv","text":"def dump_tsv(start_dir, filename, in_list=None, **kwargs) Dumps output of make_tsv manifest to a file. Arguments : start_dir : str Path to start directory in_list : list List of files for which to create manifest entries. Will default to recursive directory crawl OPTIONAL KEYWORD ARGUMENTS def_tag : str Default Dataverse tag (eg, Data, Documentation, etc) Separate tags with an easily splitable character: eg. (\u2018Data, 2016\u2019) - Default - \u2018Data\u2019 inc_header : bool Include header for tsv. Default : True quotype - int integer value or csv quote type. Default : csv.QUOTE_MINIMAL Acceptable values: csv.QUOTE_MINIMAL / 0 csv.QUOTE_ALL / 1 csv.QUOTE_NONNUMERIC / 2 csv.QUOTE_NONE / 3","title":"dump_tsv"},{"location":"api_ref/#file_path","text":"def file_path(fpath, trunc='') -> str Create relative file path from full path string file_path(\u2018/tmp/Data/2011/excelfile.xlsx\u2019, \u2018/tmp/\u2019) \u2018Data/2011\u2019 file_path(\u2018/tmp/Data/2011/excelfile.xlsx\u2019, \u2018/tmp\u2019) \u2018Data/2011\u2019 Arguments : fpath : str File location (ie, complete path) trunc : str Leftmost portion of path to remove","title":"file_path"},{"location":"api_ref/#check_lock","text":"def check_lock(dv_url, study, apikey) -> bool Checks study lock status; returns True if locked. Arguments : dvurl : str URL of Dataverse installation study - str Persistent ID of study apikey : str API key for user","title":"check_lock"},{"location":"api_ref/#force_notab_unlock","text":"def force_notab_unlock(study, dv_url, fid, apikey, try_uningest=True) -> int Forcibly unlocks and uningests to prevent tabular file processing. Required if mime and filename spoofing is not sufficient. Returns 0 if unlocked, file id if locked (and then unlocked). Arguments : study : str Persistent indentifer of study dv_url : str URL to base Dataverse installation fid : str File ID for file object apikey : str API key for user try_uningest : bool Try to uningest the file that was locked. - Default - True","title":"force_notab_unlock"},{"location":"api_ref/#uningest_file","text":"def uningest_file(dv_url, fid, apikey, study='n/a') Tries to uningest a file that has been ingested. Requires superuser API key. Arguments : dv_url : str URL to base Dataverse installation fid : int or str File ID of file to uningest apikey : str API key for superuser study : str Optional handle parameter for log messages","title":"uningest_file"},{"location":"api_ref/#upload_file","text":"def upload_file(fpath, hdl, **kwargs) Uploads file to Dataverse study and sets file metadata and tags. Arguments : fpath : str file location (ie, complete path) hdl : str Dataverse persistent ID for study (handle or DOI) kwargs : dict other parameters. Acceptable keywords and contents are: dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user descr : str OPTIONAL file description md5 : str OPTIONAL md5sum for file checking tags : list OPTIONAL list of text file tags. Eg [\u2018Data\u2019, \u2018June 2020\u2019] dirlabel : str OPTIONAL Unix style relative pathname for Dataverse file path: eg: path/to/file/ nowait : bool OPTIONAL Force a file unlock and uningest instead of waiting for processing to finish trunc : str OPTIONAL Leftmost portion of path to remove rest : bool OPTIONAL Restrict file. Defaults to false unless True supplied mimetype : str OPTIONAL Mimetype of file. Useful if using File Previewers. Mimetype for zip files (application/zip) will be ignored to circumvent Dataverse\u2019s automatic unzipping function. label : str OPTIONAL If included in kwargs, this value will be used for the label timeout = int OPTIONAL Timeout in seconds","title":"upload_file"},{"location":"api_ref/#restrict_file","text":"def restrict_file(**kwargs) Restrict file in Dataverse study. Arguments : kwargs : dict other parameters. Acceptable keywords and contents are: One of pid or fid is required pid : str file persistent ID fid : str file database ID dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user rest : bool On True, restrict. Default True","title":"restrict_file"},{"location":"api_ref/#upload_from_tsv","text":"def upload_from_tsv(fil, hdl, **kwargs) Utility for bulk uploading. Assumes fil is formatted as tsv with headers \u2018file\u2019, \u2018description\u2019, \u2018tags\u2019. \u2018tags\u2019 field will be split on commas. Arguments : fil : filelike object Open file object or io.IOStream() hdl : str Dataverse persistent ID for study (handle or DOI) trunc : str Leftmost portion of Dataverse study file path to remove. - eg - trunc =\u2019/home/user/\u2019 if the tsv field is \u2018/home/user/Data/ASCII\u2019 would set the path for that line of the tsv to \u2018Data/ASCII\u2019. Defaults to None. kwargs : dict other parameters. Acceptable keywords and contents are: dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user rest : bool On True, restrict access. Default False","title":"upload_from_tsv"},{"location":"api_ref/#dataverse_utilsldc","text":"Creates dataverse JSON from Linguistic Data Consortium website page.","title":"dataverse_utils.ldc"},{"location":"api_ref/#ldc-objects","text":"class Ldc(ds.Serializer) An LDC item (eg, LDC2021T01)","title":"Ldc Objects"},{"location":"api_ref/#__init___4","text":"def __init__(ldc, cert=None) Returns a dict with keys created from an LDC catalogue web page. Arguments : ldc : str Linguistic Consortium Catalogue Number (eg. \u2018LDC2015T05\u2019. This is what forms the last part of the LDC catalogue URL. cert : str Path to certificate chain; LDC has had a problem with intermediate certificates, so you can download the chain with a browser and supply a path to the .pem with this parameter","title":"__init__"},{"location":"api_ref/#ldcjson","text":"@property def ldcJson() Returns a JSON based on the LDC web page scraping","title":"ldcJson"},{"location":"api_ref/#dryadjson","text":"@property def dryadJson() LDC metadata in Dryad JSON format","title":"dryadJson"},{"location":"api_ref/#dvjson","text":"@property def dvJson() LDC metadata in Dataverse JSON format","title":"dvJson"},{"location":"api_ref/#embargo","text":"@property def embargo() Boolean indicating embargo status","title":"embargo"},{"location":"api_ref/#filejson","text":"@property def fileJson(timeout=45) Returns False: No attached files possible at LDC","title":"fileJson"},{"location":"api_ref/#files","text":"@property def files() Returns None. No files possible","title":"files"},{"location":"api_ref/#fetch_record","text":"def fetch_record(url=None, timeout=45) Downloads record from LDC website","title":"fetch_record"},{"location":"api_ref/#make_ldc_json","text":"def make_ldc_json() Returns a dict with keys created from an LDC catalogue web page.","title":"make_ldc_json"},{"location":"api_ref/#name_parser","text":"@staticmethod def name_parser(name) Returns lastName/firstName JSON snippet from name Arguments : name : str A name","title":"name_parser"},{"location":"api_ref/#make_dryad_json","text":"def make_dryad_json(ldc=None) Creates a Dryad-style dict from an LDC dictionary Arguments : ldc : dict Dictionary containing LDC data. Defaults to self.ldcJson","title":"make_dryad_json"},{"location":"api_ref/#find_block_index","text":"@staticmethod def find_block_index(dvjson, key) Finds the index number of an item in Dataverse\u2019s idiotic JSON list Arguments : dvjson : dict Dataverse JSON key : str key for which to find list index","title":"find_block_index"},{"location":"api_ref/#make_dv_json","text":"def make_dv_json(ldc=None) Returns complete Dataverse JSON Arguments : ldc : dict LDC dictionary. Defaults to self.ldcJson","title":"make_dv_json"},{"location":"api_ref/#upload_metadata","text":"def upload_metadata(**kwargs) -> dict Uploads metadata to dataverse Returns json from connection attempt. Arguments : kwargs: url : str base url to Dataverse key : str api key dv : str Dataverse to which it is being uploaded","title":"upload_metadata"},{"location":"credits/","text":"Credits \u00b6 Dataverse_utils and their associated command line programs were written by Paul Lesack . Testing and UI suggestions from Jeremy Buhler . This is a product of the University of British Columbia Library Research Commons .","title":"Credits"},{"location":"credits/#credits","text":"Dataverse_utils and their associated command line programs were written by Paul Lesack . Testing and UI suggestions from Jeremy Buhler . This is a product of the University of British Columbia Library Research Commons .","title":"Credits"},{"location":"faq/","text":"Frequently asked questions \u00b6 \u201cFrequently\u201d may be relative. 1. I\u2019m using Windows and the scripts don\u2019t seem to be working/recognized by [choice of command line interface here] \u00b6 There are (at least) four different ways to get some sort of command line access. The traditional command line, PowerShell, via SSH and Git bash. That\u2019s not even including the linux subsystem. The document on Windows script troubles gives common solutions. 2. I am using Windows [7-10]. I\u2019ve installed via pip using a virtual environment, but they don\u2019t use my virtual environment\u2019s Python. \u00b6 What seems like a simple problem is surprisingly complex, as outlined here: https://matthew-brett.github.io/pydagogue/installing_scripts.html . This is further complicated by some other factors. If you have only one Python installation on your machine, you are probably OK. Mind you, if you\u2019re looking at this and that\u2019s the case, maybe I\u2019m wrong. If you have multiple Pythons, you can try changing your environment variables to point to the correct Python. If you are using ArcGIS products, ArcGIS may write items into your Windows registry which will associate any .py file with it\u2019s grossly outdated Python 2.7, or just the wrong Python. More specifically: Computer\\HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command in the Windows registry. Unfortunately, the Windows computer that I have available for testing (as I normally use Linux or Mac) does not have an administrator account, so I can\u2019t confirm that changing this key will work (although there\u2019s no reason to believe it won\u2019t). This is a pain. Is there something less irritating that would work? \u00b6 Yes, there is. You can still run the scripts manually. There are two options for this. Download the repository via git to a convenient place and use the files in the scripts/ directory Point your %PATH% to where the scripts are installed. To find out where they are installed: TLDR: version: Point your %PATH% (and use first part of the path) to point to your [venv]\\Scripts directory, because they\u2019re probably there. Long winded instructions/explanation: Start a Python session: import sys sys.path [x for x in sys.path if x.endswith(\u2018site-packages\u2019)] The location of the scripts will be written in [whatever the output of sys.path]/dataverse_utils[somestuff]egg-info/installed-files.txt , usually three levels up in the scripts directory. Ironically, this is also the location of the activate portion of the comand required to start a virtual environment (if you are using a virtual environment). For some background on this, venv in Linux and Mac versions of Python uses bin , and reserves scripts for the scripts directory. Windows, however, uses Scripts for the venv module, and to make it worse it\u2019s not usually case sensitive, so anything in scripts gets put into Scripts .","title":"FAQ"},{"location":"faq/#frequently-asked-questions","text":"\u201cFrequently\u201d may be relative.","title":"Frequently asked questions"},{"location":"faq/#1-im-using-windows-and-the-scripts-dont-seem-to-be-workingrecognized-by-choice-of-command-line-interface-here","text":"There are (at least) four different ways to get some sort of command line access. The traditional command line, PowerShell, via SSH and Git bash. That\u2019s not even including the linux subsystem. The document on Windows script troubles gives common solutions.","title":"1. I'm using Windows and the scripts don't seem to be working/recognized by [choice of command line interface here]"},{"location":"faq/#2-i-am-using-windows-7-10-ive-installed-via-pip-using-a-virtual-environment-but-they-dont-use-my-virtual-environments-python","text":"What seems like a simple problem is surprisingly complex, as outlined here: https://matthew-brett.github.io/pydagogue/installing_scripts.html . This is further complicated by some other factors. If you have only one Python installation on your machine, you are probably OK. Mind you, if you\u2019re looking at this and that\u2019s the case, maybe I\u2019m wrong. If you have multiple Pythons, you can try changing your environment variables to point to the correct Python. If you are using ArcGIS products, ArcGIS may write items into your Windows registry which will associate any .py file with it\u2019s grossly outdated Python 2.7, or just the wrong Python. More specifically: Computer\\HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command in the Windows registry. Unfortunately, the Windows computer that I have available for testing (as I normally use Linux or Mac) does not have an administrator account, so I can\u2019t confirm that changing this key will work (although there\u2019s no reason to believe it won\u2019t).","title":"2. I am using Windows [7-10]. I've installed via pip using a virtual environment, but they don't use my virtual environment's Python."},{"location":"faq/#this-is-a-pain-is-there-something-less-irritating-that-would-work","text":"Yes, there is. You can still run the scripts manually. There are two options for this. Download the repository via git to a convenient place and use the files in the scripts/ directory Point your %PATH% to where the scripts are installed. To find out where they are installed: TLDR: version: Point your %PATH% (and use first part of the path) to point to your [venv]\\Scripts directory, because they\u2019re probably there. Long winded instructions/explanation: Start a Python session: import sys sys.path [x for x in sys.path if x.endswith(\u2018site-packages\u2019)] The location of the scripts will be written in [whatever the output of sys.path]/dataverse_utils[somestuff]egg-info/installed-files.txt , usually three levels up in the scripts directory. Ironically, this is also the location of the activate portion of the comand required to start a virtual environment (if you are using a virtual environment). For some background on this, venv in Linux and Mac versions of Python uses bin , and reserves scripts for the scripts directory. Windows, however, uses Scripts for the venv module, and to make it worse it\u2019s not usually case sensitive, so anything in scripts gets put into Scripts .","title":"This is a pain. Is there something less irritating that would work?"},{"location":"scripts/","text":"Console utilities \u00b6 code { white-space : pre-wrap !important; } These utilities are available at the command line/command prompt and don\u2019t require any Python knowledge except how to install a Python library via pip, as outlined in the overview document. Once installed via pip, the scripts will be available via the command line and will not require calling Python explicitly. That is, they can be called from the command line directly. For example: dv_tsv_manifest is all you will need to type. Note that these programs have been primarily tested on Linux and MacOS, with Windows a tertiary priority . Windows is notable for its unusual file handling, so, as the MIT licence stipulates, there is no warranty as to the suitability for a particular purpose. In alphabetical order: dv_del \u00b6 This is bulk deletion utility for unpublished studies (or even single studies). It\u2019s useful when your automated procedures have gone wrong, or if you don\u2019t feel like navigating through many menus. Note the -i switch which can ask for manual confirmation of deletions. Usage usage: dv_del [-h] -k KEY [-d DATAVERSE | -p PID] [-i] [-u DVURL] [--version] Delete draft studies from a Dataverse collection options: -h, --help show this help message and exit -k KEY, --key KEY Dataverse user API key -d DATAVERSE, --dataverse DATAVERSE Dataverse collection short name from which to delete all draft records. eg. \"ldc\" -p PID, --persistentId PID Handle or DOI to delete in format hdl:11272.1/FK2/12345 -i, --interactive Confirm each study deletion -u DVURL, --url DVURL URL to base Dataverse installation --version Show version number and exit dv_ldc_uploader \u00b6 This is a very specialized utility which will scrape metadata from the Linguistic Data Consortium (LDC) and create a metadata record in a Dataverse. The LDC does not have an API, so the metadata is scraped from their web site. This means that the metadata may not be quite as controlled as that which comes from an API. Data from the LDC website is converted to Dryad -style JSON via dataverse_utils.ldc via the use of the dryad2dataverse library. There are two main methods of use for this utility: Multiple metadata uploads. Multiple LDC record numbers can be supplied and a study without files will be created for each one. If a TSV file with file information is upplied via the -t or --tsv switch, the utility will upload a single LDC study and upload the contents of the tsv file to the created record. Important note As of early 2023, the LDC website is not supported by certifi . You will need to manually supply a certificate chain to use the utility. To obtain the certificate chain (in Firefox) perform the following steps: Select Tools/Page Info In the Security tab, select View Certificate Scroll to \u201cPEM (chain)\u201d Right click and \u201cSave link as\u201d Use this file for the -c/\u2013certchain option below. Searching for \u201cdownload pem certificate chain [browser]\u201d in a search engine will undoubtedly bring up results for whatever browser you like. Usage usage: dv_ldc_uploader [-h] [-u URL] -k KEY [-d DVS] [-t TSV] [-r] [-n CNAME] [-c CERTCHAIN] [-e EMAIL] [-v] [--version] studies [studies ...] Linguistic Data Consortium metadata uploader for Dataverse. This utility will scrape the metadata from the LDC website (https://catalog.ldc.upenn.edu) and upload data based on a TSV manifest. Please note that this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: studies LDC Catalogue numbers to process, separated by spaces. eg. \"LDC2012T19 LDC2011T07\". Case is ignored, so \"ldc2012T19\" will also work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to \"https://abacus.library.ubc.ca\" -k KEY, --key KEY API key -d DVS, --dvs DVS Short name of target Dataverse collection (eg: ldc). Defaults to \"ldc\" -t TSV, --tsv TSV Manifest tsv file for uploading and metadata. If not supplied, only metadata will be uploaded. Using this option requires only one positional *studies* argument -r, --no-restrict Don't restrict files after upload. -n CNAME, --cname CNAME Study contact name. Default: \"Abacus support\" -c CERTCHAIN, --certchain CERTCHAIN Certificate chain PEM: use if SSL issues are present. The PEM chain must be downloaded with a browser. Default: None -e EMAIL, --email EMAIL Dataverse study contact email address. Default: abacus-support@lists.ubc.ca -v, --verbose Verbose output --version Show version number and exit dv_manifest_gen \u00b6 Not technically a Dataverse-specific script, this utility will generate a tab-separated value output. The file consists of 3 columns: file, description and tags , and optionally a mimetype column. Editing the result and using the upload utility to parse the tsv will add descriptive metadata, tags and file paths to an upload instead of laboriously using the Dataverse GUI. Tags may be separated by commas, eg: \u201cData, SAS, June 2021\u201d. Using stdout and a redirect will also save time. First dump a file as normal. Add other files to the end with different information using the exclude header switch -x and different tags along with output redirection >> . Usage usage: dv_manifest_gen [-h] [-f FILENAME] [-t TAG] [-x] [-r] [-q QUOTE] [-a] [-m] [--version] [files ...] Creates a file manifest in tab separated value format which can then be edited and used for file uploads to a Dataverse collection. Files can be edited to add file descriptions and comma-separated tags that will be automatically attached to metadata using products using the dataverse_utils library. Will dump to stdout unless -f or --filename is used. Using the command and a dash (ie, \"dv_manifest_gen.py -\" produces full paths for some reason. positional arguments: files Files to add to manifest. Leaving it blank will add all files in the current directory. If using -r will recursively show all. options: -h, --help show this help message and exit -f FILENAME, --filename FILENAME Save to file instead of outputting to stdout -t TAG, --tag TAG Default tag(s). Separate with comma and use quotes if there are spaces. eg. \"Data, June 2021\". Defaults to \"Data\" -x, --no-header Don't include header in output. Useful if creating a complex tsv using redirects (ie, \">>\"). -r, --recursive Recursive listing. -q QUOTE, --quote QUOTE Quote type. Cell value quoting parameters. Options: none (no quotes), min (minimal, ie. special characters only )nonum (non-numeric), all (all cells). Default: min -a, --show-hidden Include hidden files. -m, --mime Include autodetected mimetypes --version Show version number and exit dv_pg_facet_date \u00b6 This specialized tool is designed to be run on the server on which the Dataverse installation exists. When material is published in a Dataverse installation, the \u201cPublication Year\u201d facet in the Dataverse GUI is automatically populated with a date, which is the publication date in that Dataverse installation . This makes sense from the point of view of research data which is first deposited into a Dataverse installation, but fails as a finding aid for either; older data sets that have been migrated and reingested licensed data sets which may have been published years before they were purchased and ingested. For example, if you have a dataset that was published in 1971 but you only added it to your Dataverse installation in 2021, it is not necessarily intuitive to the end user that the \u201cpublication date\u201d in this instance would be 2021. Ideally, you might like it to be 1971. Unfortunately, there is no API-based tool to manage this date. The only way to change it, as of late 2021, is to modify the underlying PostgreSQL database directly with the desired date. Subsequently, the study must be reindexed so that the revised publication date appears as an option in the facet. This tool will perform those operations. However, the tool must be run on the server on which the Dataverse installation exists, as reindexing API calls must be from localhost and database access is necessarily restricted. There are a few other prerequisites for using this tool which differ from the rest of the scripts included in this package. The user must have shell access to the server hosting the Dataverse installation Python 3.6 or higher must be installed The user must possess a valid Dataverse API key The user must know the PostgreSQL password If the database name and user have been changed, the user must know this as well The script requires the manual installation of psycopg2-binary or have a successfully compiled psycopg2 package for Python. See https://www.psycopg.org/docs/ . This is not installed with the normal pip install of the dataverse_utils package as none of the other scripts require it and, in general, the odds of someone using this utility are low. If you forget to install it, the program will politely remind you. This cannot be stressed enough. This tool will directly change values within the PostgreSQL database which holds all of Dataverse\u2019s information . Use this at your own risk; no warranty is implied and no responsibility will be accepted for data loss, etc. If any of the options listed for the utility make no sense to you or sound like gibberish, do not use this tool. Because editing the underlying database may have a high pucker factor for some, there is both a dry-run option and an option to just dump out SQL instead of actually touching anything. These two options do not perform a study reindex and don\u2019t alter the contents of the database. Usage usage: dv_pg_facet_date [-h] [-d DBNAME] [-u USER] -p PASSWORD [-r | -o] [-s] -k KEY [-w URL] [--version] pids [pids ...] {distributionDate,productionDate,dateOfDeposit,dist,prod,dep} A utility to change the 'Production Date' web interface facet in a Dataverse installation to one of the three acceptable date types: 'distributionDate', 'productionDate', or 'dateOfDeposit'. This must be done in the PostgreSQL database directly, so this utility must be run on the *server* that hosts a Dataverse installation. Back up your database if you are unsure. positional arguments: pids persistentIdentifier {distributionDate,productionDate,dateOfDeposit,dist,prod,dep} date type which is to be shown in the facet. The short forms are aliases for the long forms. optional arguments: -h, --help show this help message and exit -d DBNAME, --dbname DBNAME Database name -u USER, --user USER PostgreSQL username -p PASSWORD, --password PASSWORD PostgreSQL password -r, --dry-run print proposed SQL to stdout -o, --sql-only dump sql to file called *pg_sql.sql* in current directory. Appends to file if it exists -s, --save-old Dump old values to tsv called *pg_changed.tsv* in current directory. Appends to file if it exists -k KEY, --key KEY API key for Dataverse installation. -w URL, --url URL URL for base Dataverse installation. Default https://abacus.library.ubc.ca --version Show version number and exit THIS WILL EDIT YOUR POSTGRESQL DATABASE DIRECTLY. USE AT YOUR OWN RISK. dv_record_copy \u00b6 Copies an existing Dataverse study metadata record to a target collection, or replaces a currently existing record. Files are not copied, only the study record. This utility is useful for mateial which is in a series, requiring only minor changes for each iteration. Usage usage: dv_record_copy [-h] [-u URL] -k KEY (-c COLLECTION | -r REPLACE) [-v] pid Record duplicator for Dataverse. This utility will download a Dataverse record And then upload the study level metadata into a new record in a user-specified collection. Please note that this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: pid PID of original dataverse recordseparated by spaces. eg. \"LDC2012T19 LDC2011T07\". Case is ignored, so \"ldc2012T19\" will also work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to \"https://abacus.library.ubc.ca\" -k KEY, --key KEY API key -c COLLECTION, --collection COLLECTION Short name of target Dataverse collection (eg: ldc). Defaults to \"ldc\" -r REPLACE, --replace REPLACE Replace metadata data in record with this PID -v, --version Show version number and exit dv_release \u00b6 A bulk release utility for Dataverse. This utility will normally be used after a migration or large data transfer, such as a dryad2dataverse transfer from the Dryad data repository. It can release studies individually by persistent ID or just release all unreleased files in a Dataverse. Usage usage: dv_release [-h] [-u URL] -k KEY [-i] [--time STIME] [-v] [-r] [-d DV | -p PID [PID ...]] [--version] Bulk file releaser for unpublished Dataverse studies. Either releases individual studies or all unreleased studies in a single Dataverse collection. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Default: https://abacus.library.ubc.ca -k KEY, --key KEY API key -i, --interactive Manually confirm each release --time STIME, -t STIME Time between release attempts in seconds. Default 10 -v Verbose mode -r, --dry-run Only output a list of studies to be released -d DV, --dv DV Short name of Dataverse collection to process (eg: statcan) -p PID [PID ...], --pid PID [PID ...] Handles or DOIs to release in format hdl:11272.1/FK2/12345 or doi:10.80240/FK2/NWRABI. Multiple values OK --version Show version number and exit dv_replace_licen[cs]e \u00b6 This will replace the text in a record with the text Markdown file. Text is converted to HTML. Optionally, the record can be republished without incrementing the version (ie, with type=updatecurrent . usage: dv_replace_licence [-h] [-u URL] -l LIC -k KEY [-r] [--version] studies [studies ...] Replaces the licence text in a Dataverse study and [optionally] republishes it as the same version. Superuser privileges are required for republishing as the version is not incremented. This software requires the Dataverse installation to be running Dataverse software version >= 5.6. positional arguments: studies Persistent IDs of studies options: -h, --help show this help message and exit -u URL, --url URL Base URL of Dataverse installation. Defaults to \"https://abacus.library.ubc.ca\" -l LIC, --licence LIC Licence file in Markdown format -k KEY, --key KEY Dataverse API key -r, --republish Republish study without incrementing version --version Show version number and exit dv_study_migrator \u00b6 If for some reason you need to copy everything from a Dataverse record to a different Dataverse installation or a different collection, this utility will do it for you. Metadata, file names, paths, restrictions etc will all be copied. There are some limitations, though, as only the most recent version will be copied and date handling is done on the target server. The utility will either copy records specifice with a persistent identifer (PID) to a target collection on the same or another server, or replace records with an existing PID. usage: dv_study_migrator [-h] -s SOURCE_URL -a SOURCE_KEY -t TARGET_URL -b TARGET_KEY [-o TIMEOUT] (-c COLLECTION | -r REPLACE [REPLACE ...]) [-v] pids [pids ...] Record migrator for Dataverse. This utility will take the most recent version of a study from one Dataverse installation and copy the metadata and records to another, completely separate dataverse installation. You could also use it to copy records from one collection to another. positional arguments: pids PID(s) of original Dataverse record(s) in source Dataverse separated by spaces. eg. \"hdl:11272.1/AB2/JEG5RH doi:11272.1/AB2/JEG5RH\". Case is ignored. options: -h, --help show this help message and exit -s SOURCE_URL, --source_url SOURCE_URL Source Dataverse installation base URL. -a SOURCE_KEY, --source_key SOURCE_KEY API key for source Dataverse installation. -t TARGET_URL, --target_url TARGET_URL Source Dataverse installation base URL. -b TARGET_KEY, --target_key TARGET_KEY API key for target Dataverse installation. -o TIMEOUT, --timeout TIMEOUT Request timeout in seconds. Default 100. -c COLLECTION, --collection COLLECTION Short name of target Dataverse collection (eg: dli). -r REPLACE [REPLACE ...], --replace REPLACE [REPLACE ...] Replace data in these target PIDs with data from the source PIDS. Number of PIDs listed here must match the number of PID arguments to follow. That is, the number of records must be equal. Records will be matched on a 1-1 basis in order. For example: [rest of command] -r doi:123.34/etc hdl:12323/AB/SOMETHI will replace the record with identifier 'doi' with the data from 'hdl'. Make sure you don't use this as the penultimate switch, because then it's not possible to disambiguate PIDS from this argument and positional arguments. ie, something like dv_study_migrator -r blah blah -s http//test.invalid etc. -v, --version Show version number and exit dv_upload_tsv \u00b6 Now that you have a tsv full of nicely described data, you can easily upload it to an existing study if you know the persistent ID and have an API key. For the best metadata, you should probably edit it manually to add correct descriptive metadata, notably the \u201cDescription\u201d and \u201cTags\u201d. Tags are split separated by commas, so it\u2019s possible to have multiple tags for each data item, like \u201cData, SPSS, June 2021\u201d. File paths are automatically generated from the \u201cfile\u201d column. Because of this, you should probably use relative paths rather than absolute paths unless you want to have a lengthy path string in Dataverse. If uploading a tsv which includes mimetypes, be aware that mimetypes for zip files will be ignored to circumvent Dataverse\u2019s automatic unzipping feature. The rationale for manually specifiying mimetypes is to enable the use of previews which require a specific mimetype to function, but Dataverse does not correctly detect the type. For example, the GeoJSON file previewer requires a mimetype of application/geo+json , but the detection of this mimetype is not supported until Dataverse v5.9. By manually setting the mimetype, the previewer can be used by earlier Dataverse versions. Usage usage: dv_upload_tsv [-h] -p PID -k KEY [-u URL] [-r] [-n] [-t TRUNCATE] [--version] tsv Uploads data sets to an *existing* Dataverse study from the contents of a TSV (tab separated value) file. Metadata, file tags, paths, etc are all read from the TSV. JSON output from the Dataverse API is printed to stdout during the process. By default, files will be unrestricted but the utility will ask for confirmation before uploading. positional arguments: tsv TSV file to upload options: -h, --help show this help message and exit -p PID, --pid PID Dataverse study persistent identifier (DOI/handle) -k KEY, --key KEY API key -u URL, --url URL Dataverse installation base url. defaults to \"https://abacus.library.ubc.ca\" -r, --restrict Restrict files after upload. -n, --no-confirm Don't confirm non-restricted status -t TRUNCATE, --truncate TRUNCATE Left truncate file path. As Dataverse studies can retain directory structure, you can set an arbitrary starting point by removing the leftmost portion. Eg: if the TSV has a file path of /home/user/Data/file.txt, setting --truncate to \"/home/user\" would have file.txt in the Data directory in the Dataverse study. The file is still loaded from the path in the spreadsheet. Defaults to no truncation. --version Show version number and exit Notes for Windows users \u00b6 Command line scripts for Python may not necessarily behave the way they do in Linux/Mac, depending on how you access them. For detailed information on Windows systems, please see the Windows testing document","title":"Console utilities"},{"location":"scripts/#console-utilities","text":"code { white-space : pre-wrap !important; } These utilities are available at the command line/command prompt and don\u2019t require any Python knowledge except how to install a Python library via pip, as outlined in the overview document. Once installed via pip, the scripts will be available via the command line and will not require calling Python explicitly. That is, they can be called from the command line directly. For example: dv_tsv_manifest is all you will need to type. Note that these programs have been primarily tested on Linux and MacOS, with Windows a tertiary priority . Windows is notable for its unusual file handling, so, as the MIT licence stipulates, there is no warranty as to the suitability for a particular purpose. In alphabetical order:","title":"Console utilities"},{"location":"scripts/#dv_del","text":"This is bulk deletion utility for unpublished studies (or even single studies). It\u2019s useful when your automated procedures have gone wrong, or if you don\u2019t feel like navigating through many menus. Note the -i switch which can ask for manual confirmation of deletions. Usage usage: dv_del [-h] -k KEY [-d DATAVERSE | -p PID] [-i] [-u DVURL] [--version] Delete draft studies from a Dataverse collection options: -h, --help show this help message and exit -k KEY, --key KEY Dataverse user API key -d DATAVERSE, --dataverse DATAVERSE Dataverse collection short name from which to delete all draft records. eg. \"ldc\" -p PID, --persistentId PID Handle or DOI to delete in format hdl:11272.1/FK2/12345 -i, --interactive Confirm each study deletion -u DVURL, --url DVURL URL to base Dataverse installation --version Show version number and exit","title":"dv_del"},{"location":"scripts/#dv_ldc_uploader","text":"This is a very specialized utility which will scrape metadata from the Linguistic Data Consortium (LDC) and create a metadata record in a Dataverse. The LDC does not have an API, so the metadata is scraped from their web site. This means that the metadata may not be quite as controlled as that which comes from an API. Data from the LDC website is converted to Dryad -style JSON via dataverse_utils.ldc via the use of the dryad2dataverse library. There are two main methods of use for this utility: Multiple metadata uploads. Multiple LDC record numbers can be supplied and a study without files will be created for each one. If a TSV file with file information is upplied via the -t or --tsv switch, the utility will upload a single LDC study and upload the contents of the tsv file to the created record. Important note As of early 2023, the LDC website is not supported by certifi . You will need to manually supply a certificate chain to use the utility. To obtain the certificate chain (in Firefox) perform the following steps: Select Tools/Page Info In the Security tab, select View Certificate Scroll to \u201cPEM (chain)\u201d Right click and \u201cSave link as\u201d Use this file for the -c/\u2013certchain option below. Searching for \u201cdownload pem certificate chain [browser]\u201d in a search engine will undoubtedly bring up results for whatever browser you like. Usage usage: dv_ldc_uploader [-h] [-u URL] -k KEY [-d DVS] [-t TSV] [-r] [-n CNAME] [-c CERTCHAIN] [-e EMAIL] [-v] [--version] studies [studies ...] Linguistic Data Consortium metadata uploader for Dataverse. This utility will scrape the metadata from the LDC website (https://catalog.ldc.upenn.edu) and upload data based on a TSV manifest. Please note that this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: studies LDC Catalogue numbers to process, separated by spaces. eg. \"LDC2012T19 LDC2011T07\". Case is ignored, so \"ldc2012T19\" will also work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to \"https://abacus.library.ubc.ca\" -k KEY, --key KEY API key -d DVS, --dvs DVS Short name of target Dataverse collection (eg: ldc). Defaults to \"ldc\" -t TSV, --tsv TSV Manifest tsv file for uploading and metadata. If not supplied, only metadata will be uploaded. Using this option requires only one positional *studies* argument -r, --no-restrict Don't restrict files after upload. -n CNAME, --cname CNAME Study contact name. Default: \"Abacus support\" -c CERTCHAIN, --certchain CERTCHAIN Certificate chain PEM: use if SSL issues are present. The PEM chain must be downloaded with a browser. Default: None -e EMAIL, --email EMAIL Dataverse study contact email address. Default: abacus-support@lists.ubc.ca -v, --verbose Verbose output --version Show version number and exit","title":"dv_ldc_uploader"},{"location":"scripts/#dv_manifest_gen","text":"Not technically a Dataverse-specific script, this utility will generate a tab-separated value output. The file consists of 3 columns: file, description and tags , and optionally a mimetype column. Editing the result and using the upload utility to parse the tsv will add descriptive metadata, tags and file paths to an upload instead of laboriously using the Dataverse GUI. Tags may be separated by commas, eg: \u201cData, SAS, June 2021\u201d. Using stdout and a redirect will also save time. First dump a file as normal. Add other files to the end with different information using the exclude header switch -x and different tags along with output redirection >> . Usage usage: dv_manifest_gen [-h] [-f FILENAME] [-t TAG] [-x] [-r] [-q QUOTE] [-a] [-m] [--version] [files ...] Creates a file manifest in tab separated value format which can then be edited and used for file uploads to a Dataverse collection. Files can be edited to add file descriptions and comma-separated tags that will be automatically attached to metadata using products using the dataverse_utils library. Will dump to stdout unless -f or --filename is used. Using the command and a dash (ie, \"dv_manifest_gen.py -\" produces full paths for some reason. positional arguments: files Files to add to manifest. Leaving it blank will add all files in the current directory. If using -r will recursively show all. options: -h, --help show this help message and exit -f FILENAME, --filename FILENAME Save to file instead of outputting to stdout -t TAG, --tag TAG Default tag(s). Separate with comma and use quotes if there are spaces. eg. \"Data, June 2021\". Defaults to \"Data\" -x, --no-header Don't include header in output. Useful if creating a complex tsv using redirects (ie, \">>\"). -r, --recursive Recursive listing. -q QUOTE, --quote QUOTE Quote type. Cell value quoting parameters. Options: none (no quotes), min (minimal, ie. special characters only )nonum (non-numeric), all (all cells). Default: min -a, --show-hidden Include hidden files. -m, --mime Include autodetected mimetypes --version Show version number and exit","title":"dv_manifest_gen"},{"location":"scripts/#dv_pg_facet_date","text":"This specialized tool is designed to be run on the server on which the Dataverse installation exists. When material is published in a Dataverse installation, the \u201cPublication Year\u201d facet in the Dataverse GUI is automatically populated with a date, which is the publication date in that Dataverse installation . This makes sense from the point of view of research data which is first deposited into a Dataverse installation, but fails as a finding aid for either; older data sets that have been migrated and reingested licensed data sets which may have been published years before they were purchased and ingested. For example, if you have a dataset that was published in 1971 but you only added it to your Dataverse installation in 2021, it is not necessarily intuitive to the end user that the \u201cpublication date\u201d in this instance would be 2021. Ideally, you might like it to be 1971. Unfortunately, there is no API-based tool to manage this date. The only way to change it, as of late 2021, is to modify the underlying PostgreSQL database directly with the desired date. Subsequently, the study must be reindexed so that the revised publication date appears as an option in the facet. This tool will perform those operations. However, the tool must be run on the server on which the Dataverse installation exists, as reindexing API calls must be from localhost and database access is necessarily restricted. There are a few other prerequisites for using this tool which differ from the rest of the scripts included in this package. The user must have shell access to the server hosting the Dataverse installation Python 3.6 or higher must be installed The user must possess a valid Dataverse API key The user must know the PostgreSQL password If the database name and user have been changed, the user must know this as well The script requires the manual installation of psycopg2-binary or have a successfully compiled psycopg2 package for Python. See https://www.psycopg.org/docs/ . This is not installed with the normal pip install of the dataverse_utils package as none of the other scripts require it and, in general, the odds of someone using this utility are low. If you forget to install it, the program will politely remind you. This cannot be stressed enough. This tool will directly change values within the PostgreSQL database which holds all of Dataverse\u2019s information . Use this at your own risk; no warranty is implied and no responsibility will be accepted for data loss, etc. If any of the options listed for the utility make no sense to you or sound like gibberish, do not use this tool. Because editing the underlying database may have a high pucker factor for some, there is both a dry-run option and an option to just dump out SQL instead of actually touching anything. These two options do not perform a study reindex and don\u2019t alter the contents of the database. Usage usage: dv_pg_facet_date [-h] [-d DBNAME] [-u USER] -p PASSWORD [-r | -o] [-s] -k KEY [-w URL] [--version] pids [pids ...] {distributionDate,productionDate,dateOfDeposit,dist,prod,dep} A utility to change the 'Production Date' web interface facet in a Dataverse installation to one of the three acceptable date types: 'distributionDate', 'productionDate', or 'dateOfDeposit'. This must be done in the PostgreSQL database directly, so this utility must be run on the *server* that hosts a Dataverse installation. Back up your database if you are unsure. positional arguments: pids persistentIdentifier {distributionDate,productionDate,dateOfDeposit,dist,prod,dep} date type which is to be shown in the facet. The short forms are aliases for the long forms. optional arguments: -h, --help show this help message and exit -d DBNAME, --dbname DBNAME Database name -u USER, --user USER PostgreSQL username -p PASSWORD, --password PASSWORD PostgreSQL password -r, --dry-run print proposed SQL to stdout -o, --sql-only dump sql to file called *pg_sql.sql* in current directory. Appends to file if it exists -s, --save-old Dump old values to tsv called *pg_changed.tsv* in current directory. Appends to file if it exists -k KEY, --key KEY API key for Dataverse installation. -w URL, --url URL URL for base Dataverse installation. Default https://abacus.library.ubc.ca --version Show version number and exit THIS WILL EDIT YOUR POSTGRESQL DATABASE DIRECTLY. USE AT YOUR OWN RISK.","title":"dv_pg_facet_date"},{"location":"scripts/#dv_record_copy","text":"Copies an existing Dataverse study metadata record to a target collection, or replaces a currently existing record. Files are not copied, only the study record. This utility is useful for mateial which is in a series, requiring only minor changes for each iteration. Usage usage: dv_record_copy [-h] [-u URL] -k KEY (-c COLLECTION | -r REPLACE) [-v] pid Record duplicator for Dataverse. This utility will download a Dataverse record And then upload the study level metadata into a new record in a user-specified collection. Please note that this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: pid PID of original dataverse recordseparated by spaces. eg. \"LDC2012T19 LDC2011T07\". Case is ignored, so \"ldc2012T19\" will also work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to \"https://abacus.library.ubc.ca\" -k KEY, --key KEY API key -c COLLECTION, --collection COLLECTION Short name of target Dataverse collection (eg: ldc). Defaults to \"ldc\" -r REPLACE, --replace REPLACE Replace metadata data in record with this PID -v, --version Show version number and exit","title":"dv_record_copy"},{"location":"scripts/#dv_release","text":"A bulk release utility for Dataverse. This utility will normally be used after a migration or large data transfer, such as a dryad2dataverse transfer from the Dryad data repository. It can release studies individually by persistent ID or just release all unreleased files in a Dataverse. Usage usage: dv_release [-h] [-u URL] -k KEY [-i] [--time STIME] [-v] [-r] [-d DV | -p PID [PID ...]] [--version] Bulk file releaser for unpublished Dataverse studies. Either releases individual studies or all unreleased studies in a single Dataverse collection. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Default: https://abacus.library.ubc.ca -k KEY, --key KEY API key -i, --interactive Manually confirm each release --time STIME, -t STIME Time between release attempts in seconds. Default 10 -v Verbose mode -r, --dry-run Only output a list of studies to be released -d DV, --dv DV Short name of Dataverse collection to process (eg: statcan) -p PID [PID ...], --pid PID [PID ...] Handles or DOIs to release in format hdl:11272.1/FK2/12345 or doi:10.80240/FK2/NWRABI. Multiple values OK --version Show version number and exit","title":"dv_release"},{"location":"scripts/#dv_replace_licencse","text":"This will replace the text in a record with the text Markdown file. Text is converted to HTML. Optionally, the record can be republished without incrementing the version (ie, with type=updatecurrent . usage: dv_replace_licence [-h] [-u URL] -l LIC -k KEY [-r] [--version] studies [studies ...] Replaces the licence text in a Dataverse study and [optionally] republishes it as the same version. Superuser privileges are required for republishing as the version is not incremented. This software requires the Dataverse installation to be running Dataverse software version >= 5.6. positional arguments: studies Persistent IDs of studies options: -h, --help show this help message and exit -u URL, --url URL Base URL of Dataverse installation. Defaults to \"https://abacus.library.ubc.ca\" -l LIC, --licence LIC Licence file in Markdown format -k KEY, --key KEY Dataverse API key -r, --republish Republish study without incrementing version --version Show version number and exit","title":"dv_replace_licen[cs]e"},{"location":"scripts/#dv_study_migrator","text":"If for some reason you need to copy everything from a Dataverse record to a different Dataverse installation or a different collection, this utility will do it for you. Metadata, file names, paths, restrictions etc will all be copied. There are some limitations, though, as only the most recent version will be copied and date handling is done on the target server. The utility will either copy records specifice with a persistent identifer (PID) to a target collection on the same or another server, or replace records with an existing PID. usage: dv_study_migrator [-h] -s SOURCE_URL -a SOURCE_KEY -t TARGET_URL -b TARGET_KEY [-o TIMEOUT] (-c COLLECTION | -r REPLACE [REPLACE ...]) [-v] pids [pids ...] Record migrator for Dataverse. This utility will take the most recent version of a study from one Dataverse installation and copy the metadata and records to another, completely separate dataverse installation. You could also use it to copy records from one collection to another. positional arguments: pids PID(s) of original Dataverse record(s) in source Dataverse separated by spaces. eg. \"hdl:11272.1/AB2/JEG5RH doi:11272.1/AB2/JEG5RH\". Case is ignored. options: -h, --help show this help message and exit -s SOURCE_URL, --source_url SOURCE_URL Source Dataverse installation base URL. -a SOURCE_KEY, --source_key SOURCE_KEY API key for source Dataverse installation. -t TARGET_URL, --target_url TARGET_URL Source Dataverse installation base URL. -b TARGET_KEY, --target_key TARGET_KEY API key for target Dataverse installation. -o TIMEOUT, --timeout TIMEOUT Request timeout in seconds. Default 100. -c COLLECTION, --collection COLLECTION Short name of target Dataverse collection (eg: dli). -r REPLACE [REPLACE ...], --replace REPLACE [REPLACE ...] Replace data in these target PIDs with data from the source PIDS. Number of PIDs listed here must match the number of PID arguments to follow. That is, the number of records must be equal. Records will be matched on a 1-1 basis in order. For example: [rest of command] -r doi:123.34/etc hdl:12323/AB/SOMETHI will replace the record with identifier 'doi' with the data from 'hdl'. Make sure you don't use this as the penultimate switch, because then it's not possible to disambiguate PIDS from this argument and positional arguments. ie, something like dv_study_migrator -r blah blah -s http//test.invalid etc. -v, --version Show version number and exit","title":"dv_study_migrator"},{"location":"scripts/#dv_upload_tsv","text":"Now that you have a tsv full of nicely described data, you can easily upload it to an existing study if you know the persistent ID and have an API key. For the best metadata, you should probably edit it manually to add correct descriptive metadata, notably the \u201cDescription\u201d and \u201cTags\u201d. Tags are split separated by commas, so it\u2019s possible to have multiple tags for each data item, like \u201cData, SPSS, June 2021\u201d. File paths are automatically generated from the \u201cfile\u201d column. Because of this, you should probably use relative paths rather than absolute paths unless you want to have a lengthy path string in Dataverse. If uploading a tsv which includes mimetypes, be aware that mimetypes for zip files will be ignored to circumvent Dataverse\u2019s automatic unzipping feature. The rationale for manually specifiying mimetypes is to enable the use of previews which require a specific mimetype to function, but Dataverse does not correctly detect the type. For example, the GeoJSON file previewer requires a mimetype of application/geo+json , but the detection of this mimetype is not supported until Dataverse v5.9. By manually setting the mimetype, the previewer can be used by earlier Dataverse versions. Usage usage: dv_upload_tsv [-h] -p PID -k KEY [-u URL] [-r] [-n] [-t TRUNCATE] [--version] tsv Uploads data sets to an *existing* Dataverse study from the contents of a TSV (tab separated value) file. Metadata, file tags, paths, etc are all read from the TSV. JSON output from the Dataverse API is printed to stdout during the process. By default, files will be unrestricted but the utility will ask for confirmation before uploading. positional arguments: tsv TSV file to upload options: -h, --help show this help message and exit -p PID, --pid PID Dataverse study persistent identifier (DOI/handle) -k KEY, --key KEY API key -u URL, --url URL Dataverse installation base url. defaults to \"https://abacus.library.ubc.ca\" -r, --restrict Restrict files after upload. -n, --no-confirm Don't confirm non-restricted status -t TRUNCATE, --truncate TRUNCATE Left truncate file path. As Dataverse studies can retain directory structure, you can set an arbitrary starting point by removing the leftmost portion. Eg: if the TSV has a file path of /home/user/Data/file.txt, setting --truncate to \"/home/user\" would have file.txt in the Data directory in the Dataverse study. The file is still loaded from the path in the spreadsheet. Defaults to no truncation. --version Show version number and exit","title":"dv_upload_tsv"},{"location":"scripts/#notes-for-windows-users","text":"Command line scripts for Python may not necessarily behave the way they do in Linux/Mac, depending on how you access them. For detailed information on Windows systems, please see the Windows testing document","title":"Notes for Windows users"},{"location":"windows/","text":"Running the dataverse_utils console utilities under Windows \u00b6 On Mac and Linux, running the scripts supplied with dataverse_utils is straightforward. They\u2019re available at the command line, which means that you can simply run them by (for example): $ dv_manifest_gen.py followed by switches and variables as normal. Doing this results in output to the terminal window. This is not necessarily the case in Windows . Whether or not the utility appears on the Windows command line will likely depend on the shell you installed it with: Commonly used shells on Windows include, but are not limited to: Command prompt (cmd.exe) PowerShell Git bash Cygwin If the utilities are not functioning the way you are expecting, make sure that Python and the install location is in your PATH. As of version 0.8.3 the installation has been updated to use newer packaging standards which will ideally reduce the frequency of installation problems. Also as of v0.8.3, the .py suffix has been removed from the console utilities. This means if you are forced to run a command manually, it would be run with python [utilityname] not python [utilityname.py] Troubleshooting \u00b6 These are (likely deprecated) notes from testing on a variety of Windows installations. If you\u2019re luckly, a solution can be found below. This test case uses a new installation of https://python.org Python, v.3.9.6, installed in Windows using the GUI, so it\u2019s as basic a Windows installation as you can get. In this instance, dataverse_utils were installed using pip from the PowerShell, ie pip install git+https://github.com/ubc-library-rc/dataverse_utils . However, pip should be pip regardless of which console you use to install. Here\u2019s a handy guide to show the results of how/if the command line scripts run. This example uses dv_manifest.gen.py , but appears to be generally applicable to any scripts configured with setuptools.setup() (ie, setuptools.setup(scripts=[whatever] ). If this means nothing to you because you\u2019re not distributing your own Python packages,, just skip to the table below. Windows Terminal type \u00b6 PowerShell \u00b6 Note that on these tests the user is not an administrator . Administrator results, in all likelihood, will be completely different, ideally better. Problem Attempting to run the script results in a window popping up for a nanosecond and no output. Solution This may not occur if the PowerShell is run as an administrator. What is happening here is that the script is running, but it\u2019s showing up in a separate window. Output can be created as normal, if you use the correct switches. Unfortunately, you won\u2019t be able to see what they are, because the popup window disappears, which is not helpful. There are three potential fixes. If you can run PowerShell as an administrator, that may solve the problem. Edit the PATHEXT environment variable to include the .py extension. Note that if the user PATHEXT is edited, the system will ignore the system PATHEXT, meaning that things like .exe files won\u2019t run unless the full name is typed (eg. \u2018notepad.exe\u2019). So, if editing the user PATHEXT, make sure to include the system PATHEXT and append ;.PY to the string. Edit the PATHEXT for PowerShell itself, rather than on a system wide level. Editing $PROFILE to include the .py extension should allow the Python script to run within PowerShell. For instructions, see https://docs.microsoft.com/en-ca/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.1 . Create a profile as per How to create a profile Within that profile, $env:PATHEXT += \";.py\" Depending on the nature of your Windows installation, this may be disabled by the security policy, in which case you can also try the method above. Command prompt \u00b6 This is the traditional Windows command prompt (ie, cmd.exe ). The scripts should just work after being installed with pip, as this installation is the default. For example, run with: C:\\>dv_manifest_gen.py [arguments] Obviously it don\u2019t type the C:\\> part. SSH session \u00b6 If using the built-in Windows SSH server, scripts should simply run as per the command prompt above. Windows SSH sessions default to using the Windows command prompt, not bash. Bash sessions under SSH should function if Bash is configured as below. Git Bash \u00b6 Git Bash is part of the git suite available here: https://git-scm.com/downloads . There are a few notable wrinkles with for use with Python. During installation of Git After v2.32.0.2 (and possibly earlier), you will have the option during the installation to \u201cEnable experimental support for pseudo consoles\u201d. Doing this will allow you run Python directly from the bash shell like you would normally, and the scripts should function as per the command prompt above. As a bonus, enabling this feature seems to fix errors with pipes which formerly resulted in the stdout is not a tty error when piping shell output (for instance, to grep ). If you have not checked this box, you will need to add an alias to your .bashrc and/or .bash_profile : alias python='winpty python' alias pip='winpty pip' Either that, or you will need to start Python with winpty python , which is annoying. Similarly winpty pip . Even if you have not enabled pseudo-console support and didn\u2019t complete use option 2, the scripts should still function normally though. Having scripts work but Python not work is not optimal and confusing, so a solution is there even though it technically isn\u2019t required. There are many options for Git Bash installation; testing has not covered all possible permutations of installation options.","title":"Windows notes"},{"location":"windows/#running-the-dataverse_utils-console-utilities-under-windows","text":"On Mac and Linux, running the scripts supplied with dataverse_utils is straightforward. They\u2019re available at the command line, which means that you can simply run them by (for example): $ dv_manifest_gen.py followed by switches and variables as normal. Doing this results in output to the terminal window. This is not necessarily the case in Windows . Whether or not the utility appears on the Windows command line will likely depend on the shell you installed it with: Commonly used shells on Windows include, but are not limited to: Command prompt (cmd.exe) PowerShell Git bash Cygwin If the utilities are not functioning the way you are expecting, make sure that Python and the install location is in your PATH. As of version 0.8.3 the installation has been updated to use newer packaging standards which will ideally reduce the frequency of installation problems. Also as of v0.8.3, the .py suffix has been removed from the console utilities. This means if you are forced to run a command manually, it would be run with python [utilityname] not python [utilityname.py]","title":"Running the dataverse_utils console utilities under Windows"},{"location":"windows/#troubleshooting","text":"These are (likely deprecated) notes from testing on a variety of Windows installations. If you\u2019re luckly, a solution can be found below. This test case uses a new installation of https://python.org Python, v.3.9.6, installed in Windows using the GUI, so it\u2019s as basic a Windows installation as you can get. In this instance, dataverse_utils were installed using pip from the PowerShell, ie pip install git+https://github.com/ubc-library-rc/dataverse_utils . However, pip should be pip regardless of which console you use to install. Here\u2019s a handy guide to show the results of how/if the command line scripts run. This example uses dv_manifest.gen.py , but appears to be generally applicable to any scripts configured with setuptools.setup() (ie, setuptools.setup(scripts=[whatever] ). If this means nothing to you because you\u2019re not distributing your own Python packages,, just skip to the table below.","title":"Troubleshooting"},{"location":"windows/#windows-terminal-type","text":"","title":"Windows Terminal type"},{"location":"windows/#powershell","text":"Note that on these tests the user is not an administrator . Administrator results, in all likelihood, will be completely different, ideally better. Problem Attempting to run the script results in a window popping up for a nanosecond and no output. Solution This may not occur if the PowerShell is run as an administrator. What is happening here is that the script is running, but it\u2019s showing up in a separate window. Output can be created as normal, if you use the correct switches. Unfortunately, you won\u2019t be able to see what they are, because the popup window disappears, which is not helpful. There are three potential fixes. If you can run PowerShell as an administrator, that may solve the problem. Edit the PATHEXT environment variable to include the .py extension. Note that if the user PATHEXT is edited, the system will ignore the system PATHEXT, meaning that things like .exe files won\u2019t run unless the full name is typed (eg. \u2018notepad.exe\u2019). So, if editing the user PATHEXT, make sure to include the system PATHEXT and append ;.PY to the string. Edit the PATHEXT for PowerShell itself, rather than on a system wide level. Editing $PROFILE to include the .py extension should allow the Python script to run within PowerShell. For instructions, see https://docs.microsoft.com/en-ca/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.1 . Create a profile as per How to create a profile Within that profile, $env:PATHEXT += \";.py\" Depending on the nature of your Windows installation, this may be disabled by the security policy, in which case you can also try the method above.","title":"PowerShell"},{"location":"windows/#command-prompt","text":"This is the traditional Windows command prompt (ie, cmd.exe ). The scripts should just work after being installed with pip, as this installation is the default. For example, run with: C:\\>dv_manifest_gen.py [arguments] Obviously it don\u2019t type the C:\\> part.","title":"Command prompt"},{"location":"windows/#ssh-session","text":"If using the built-in Windows SSH server, scripts should simply run as per the command prompt above. Windows SSH sessions default to using the Windows command prompt, not bash. Bash sessions under SSH should function if Bash is configured as below.","title":"SSH session"},{"location":"windows/#git-bash","text":"Git Bash is part of the git suite available here: https://git-scm.com/downloads . There are a few notable wrinkles with for use with Python. During installation of Git After v2.32.0.2 (and possibly earlier), you will have the option during the installation to \u201cEnable experimental support for pseudo consoles\u201d. Doing this will allow you run Python directly from the bash shell like you would normally, and the scripts should function as per the command prompt above. As a bonus, enabling this feature seems to fix errors with pipes which formerly resulted in the stdout is not a tty error when piping shell output (for instance, to grep ). If you have not checked this box, you will need to add an alias to your .bashrc and/or .bash_profile : alias python='winpty python' alias pip='winpty pip' Either that, or you will need to start Python with winpty python , which is annoying. Similarly winpty pip . Even if you have not enabled pseudo-console support and didn\u2019t complete use option 2, the scripts should still function normally though. Having scripts work but Python not work is not optimal and confusing, so a solution is there even though it technically isn\u2019t required. There are many options for Git Bash installation; testing has not covered all possible permutations of installation options.","title":"Git Bash"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Dataverse utilities \u00b6 This is a generalized set of utilities which help with managing Dataverse repositories. This has nothing to do with the Microsoft product of the same name. Despite being written as they were required, that doesn\u2019t mean they\u2019re not useful or user-friendly. With these utilities you can: Upload your data sets from a tab-separated-value spreadsheet Bulk release multiple data sets Bulk delete (unpublished) assets Quickly duplicate records Replace licences and more! Get your copy today! Source code (and this documentation) is available at the Github repository https://github.com/ubc-library-rc/dataverse_utils , and the user-friendly version of the documentation is at https://ubc-library-rc.github.io/dataverse_utils . Presumably you know this already otherwise you wouldn\u2019t be reading this. Installation \u00b6 Any installation will require the use of the command line/command prompt. The easiest installation is with pip : pip install dataverse_utils There is also a server specific version if you need to use the dv_facet_date utility. This can only be run on a server hosting a Dataverse instance, so for the vast majority of users it will be unusable. This can also be installed with pip : pip install 'dataverse_utils[server]' Note the extra quotes. You can install the server version if you want to, but it\u2019s useless without server access. Upgrading \u00b6 Just as easy as installation: pip install --upgrade dataverse_utils Other methods of installing Python packages can be found at https://packaging.python.org/tutorials/installing-packages/ . Downloading the source code \u00b6 Source code is available at https://github.com/ubc-library-rc/dataverse_utils . Working on the assumption that git is installed, you can download the whole works with: git clone https://github.com/ubc-library-rc/dataverse_utils If you have mkdocs installed, you can view the documentation in a web browser by running mkdocs from the top level directory of the downloaded source files by running mkdocs serve . The components \u00b6 Console utilities \u00b6 There are eight (8) console utilities currently available. dv_del.py : Bulk (unpublished) file deletion utility dv_ldc_uploader.py : A utility which scrapes Linguistic Data Consortium metadata from their website, converts it to Dataverse JSON and uploads it, with the possibility of including local files. As of early 2023, there is an issue which requires attaching a manually downloaded certificate chain . Don\u2019t worry, that\u2019s not as hard as it sounds. dv_manifest_gen.py : Creates a simple tab-separated value format file which can be edited and then used to upload files as well as file-level metadata. Normally files will be edited after creation, usually in a spreadsheet like Excel. dv_pg_facet_date.py : A server-based tool which updates the publication date facet and performs a study reindex. dv_record_copy.py : Copies an existing Dataverse study metadata record to a target collection, or replace a currently existing record. dv_release.py : A bulk release utility. Either releases all the unreleased studies in a Dataverse or individually if persistent identifiers are available. dv_replace_licences : Replaces the licence associated with a PID with text from a Markdown file. Also available as dv_replace_licenses for those using American English. dv_upload_tsv.py : Takes a tsv file in the format from dv_manifest_gen.py and does all the uploading and metadata entry. More information about these can be found on the console utilities page . Python package: dataverse_utils \u00b6 This package contains a variety of utility functions which, for the most part, allow uploads of files and associated metadata without having to touch the Dataverse GUI or to have complex JSON attached. For example, the upload_file requires no JSON attachments: dataverse_utils.upload_file('/path/to/file.ext', dv='https://targetdataverse.invalid' descr='A file description', tags=['Data', 'Example', 'Spam'], dirlabel=['path/to/spam'], mimetype='application/geo+json') Consult the API reference for full details. ldc \u00b6 The ldc component represents the Linguistic Data Consortium or LDC. The ldc module is designed to harvest LDC metadata from its catalogue, convert it to Dataverse JSON, then upload it to a Dataverse installation. Once the study has been created, the general dataverse_utils module can handle the file uploading. The ldc module requires the dryad2dataverse package. Because of this, it requires a tiny bit more effort, because LDC material doesn\u2019t have the required metadata. Here\u2019s snippet that shows how it works. import dataverse_utils.ldc as ldc ldc.ds.constants.DV_CONTACT_EMAIL='iamcontact@test.invalid' ldc.ds.constants.DV_CONTACT_NAME='Generic Support Email' KEY = 'IAM-YOUR-DVERSE-APIKEY' stud = 'LDC2021T02' #LDC study number a = ldc.Ldc(stud) a.fetch_record() #Data goes into the 'ldc' dataverse info = a.upload_metadata(url='https://dataverse.invalid', key=KEY, dv='ldc') hdl = info['data']['persistentId'] with open('/Users/you/tmp/testme.tsv') as fil: du.upload_from_tsv(fil, hdl=hdl,dv='https://dataverse.invalid', apikey=KEY) Note that one method uses key and the other apikey . This is what is known as ad hoc . More information is available at the API reference .","title":"Overview"},{"location":"#dataverse-utilities","text":"This is a generalized set of utilities which help with managing Dataverse repositories. This has nothing to do with the Microsoft product of the same name. Despite being written as they were required, that doesn\u2019t mean they\u2019re not useful or user-friendly. With these utilities you can: Upload your data sets from a tab-separated-value spreadsheet Bulk release multiple data sets Bulk delete (unpublished) assets Quickly duplicate records Replace licences and more! Get your copy today! Source code (and this documentation) is available at the Github repository https://github.com/ubc-library-rc/dataverse_utils , and the user-friendly version of the documentation is at https://ubc-library-rc.github.io/dataverse_utils . Presumably you know this already otherwise you wouldn\u2019t be reading this.","title":"Dataverse utilities"},{"location":"#installation","text":"Any installation will require the use of the command line/command prompt. The easiest installation is with pip : pip install dataverse_utils There is also a server specific version if you need to use the dv_facet_date utility. This can only be run on a server hosting a Dataverse instance, so for the vast majority of users it will be unusable. This can also be installed with pip : pip install 'dataverse_utils[server]' Note the extra quotes. You can install the server version if you want to, but it\u2019s useless without server access.","title":"Installation"},{"location":"#upgrading","text":"Just as easy as installation: pip install --upgrade dataverse_utils Other methods of installing Python packages can be found at https://packaging.python.org/tutorials/installing-packages/ .","title":"Upgrading"},{"location":"#downloading-the-source-code","text":"Source code is available at https://github.com/ubc-library-rc/dataverse_utils . Working on the assumption that git is installed, you can download the whole works with: git clone https://github.com/ubc-library-rc/dataverse_utils If you have mkdocs installed, you can view the documentation in a web browser by running mkdocs from the top level directory of the downloaded source files by running mkdocs serve .","title":"Downloading the source code"},{"location":"#the-components","text":"","title":"The components"},{"location":"#console-utilities","text":"There are eight (8) console utilities currently available. dv_del.py : Bulk (unpublished) file deletion utility dv_ldc_uploader.py : A utility which scrapes Linguistic Data Consortium metadata from their website, converts it to Dataverse JSON and uploads it, with the possibility of including local files. As of early 2023, there is an issue which requires attaching a manually downloaded certificate chain . Don\u2019t worry, that\u2019s not as hard as it sounds. dv_manifest_gen.py : Creates a simple tab-separated value format file which can be edited and then used to upload files as well as file-level metadata. Normally files will be edited after creation, usually in a spreadsheet like Excel. dv_pg_facet_date.py : A server-based tool which updates the publication date facet and performs a study reindex. dv_record_copy.py : Copies an existing Dataverse study metadata record to a target collection, or replace a currently existing record. dv_release.py : A bulk release utility. Either releases all the unreleased studies in a Dataverse or individually if persistent identifiers are available. dv_replace_licences : Replaces the licence associated with a PID with text from a Markdown file. Also available as dv_replace_licenses for those using American English. dv_upload_tsv.py : Takes a tsv file in the format from dv_manifest_gen.py and does all the uploading and metadata entry. More information about these can be found on the console utilities page .","title":"Console utilities"},{"location":"#python-package-dataverse_utils","text":"This package contains a variety of utility functions which, for the most part, allow uploads of files and associated metadata without having to touch the Dataverse GUI or to have complex JSON attached. For example, the upload_file requires no JSON attachments: dataverse_utils.upload_file('/path/to/file.ext', dv='https://targetdataverse.invalid' descr='A file description', tags=['Data', 'Example', 'Spam'], dirlabel=['path/to/spam'], mimetype='application/geo+json') Consult the API reference for full details.","title":"Python package: dataverse_utils"},{"location":"#ldc","text":"The ldc component represents the Linguistic Data Consortium or LDC. The ldc module is designed to harvest LDC metadata from its catalogue, convert it to Dataverse JSON, then upload it to a Dataverse installation. Once the study has been created, the general dataverse_utils module can handle the file uploading. The ldc module requires the dryad2dataverse package. Because of this, it requires a tiny bit more effort, because LDC material doesn\u2019t have the required metadata. Here\u2019s snippet that shows how it works. import dataverse_utils.ldc as ldc ldc.ds.constants.DV_CONTACT_EMAIL='iamcontact@test.invalid' ldc.ds.constants.DV_CONTACT_NAME='Generic Support Email' KEY = 'IAM-YOUR-DVERSE-APIKEY' stud = 'LDC2021T02' #LDC study number a = ldc.Ldc(stud) a.fetch_record() #Data goes into the 'ldc' dataverse info = a.upload_metadata(url='https://dataverse.invalid', key=KEY, dv='ldc') hdl = info['data']['persistentId'] with open('/Users/you/tmp/testme.tsv') as fil: du.upload_from_tsv(fil, hdl=hdl,dv='https://dataverse.invalid', apikey=KEY) Note that one method uses key and the other apikey . This is what is known as ad hoc . More information is available at the API reference .","title":"ldc"},{"location":"api_ref/","text":"API Reference \u00b6 dataverse_utils \u00b6 Generalized dataverse utilities. Note that import dataverse_utils is the equivalent of import dataverse_utils.dataverse_utils dataverse_utils.dvdata \u00b6 Dataverse studies and files Study Objects \u00b6 class Study(dict) Dataverse record. Dataverse study records are pure metadata so this is represented with a dictionary. __init__ \u00b6 def __init__(pid: str, url: str, key: str, **kwargs) pid : str Record persistent identifier: hdl or doi url : str Base URL to host Dataverse instance key : str Dataverse API key with downloader privileges get_version \u00b6 @classmethod def get_version(cls, url: str, timeout: int = 100) -> float Returns a float representing a Dataverse version number. Floating point value composed of: float(f\u2019{major_version}.{minor_verson:03d}{patch:03d}\u2019) ie, version 5.9.2 would be 5.009002 url : str URL of base Dataverse instance. eg: \u2018https://abacus.library.ubc.ca\u2019 timeout : int Request timeout in seconds set_version \u00b6 def set_version(url: str, timeout: int = 100) -> None Sets self[\u2018target_version\u2019] to appropriate integer value AND formats self[\u2018upload_json\u2019] to correct JSON format url : str URL of target Dataverse instance timeout : int request timeout in seconds fix_licence \u00b6 def fix_licence() -> None With Dataverse v5.10+, a licence type of \u2018NONE\u2019 is now forbidden. Now, as per https://guides.dataverse.org/en/5.14/api/sword.html ?highlight=invalid%20license , non-standard licences may be replaced with None. This function edits the same Study object in place , so returns nothing. production_location \u00b6 def production_location() -> None Changes \u201cmultiple\u201d to True where typeName == \u2018productionPlace\u2019 in Study[\u2018upload_json\u2019] Changes are done in place . This change came into effect with Dataverse v5.13 File Objects \u00b6 class File(dict) Class representing a file on a Dataverse instance __init__ \u00b6 def __init__(url: str, key: str, **kwargs) url : str Base URL to host Dataverse instance key : str Dataverse API key with downloader privileges id : int or str File identifier; can be a file ID or PID args : list kwargs : dict To initialize correctly, pass a value from Study[\u2018file_info\u2019]. Eg: File(\u2018https://test.invalid\u2019, \u2018ABC123\u2019, **Study_instance[\u2018file_info\u2019][0]) download_file \u00b6 def download_file() Downloads the file to a temporary location. Data will be in the ORIGINAL format, not Dataverse-processed TSVs del_tempfile \u00b6 def del_tempfile() Delete tempfile if it exists produce_digest \u00b6 def produce_digest(prot: str = 'md5', blocksize: int = 2**16) -> str Returns hex digest for object fname : str Path to a file object prot : str Hash type. Supported hashes: 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'blake2b', 'blake2s', 'md5'. Default: 'md5' blocksize : int Read block size in bytes verify \u00b6 def verify() -> None Compares checksum with stated checksum dataverse_utils.scripts.dv_record_copy \u00b6 Copies a dataverse record to collection OR copies a record to an existing PID. That way all you have to do is edit a few fields in the GUI instead of painfully editing JSON or painfully using the Dataverse GUI. parsley \u00b6 def parsley() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser main \u00b6 def main() You know what this does dataverse_utils.scripts.dv_study_migrator \u00b6 Copies an entire record and migrates it including the data parsley \u00b6 def parsley() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser upload_file_to_target \u00b6 def upload_file_to_target(indict: dict, pid, source_url, source_key, target_url, target_key) Uploads a single file with metadata to a dataverse record remove_target_files \u00b6 def remove_target_files(record: dataverse_utils.dvdata.Study, timeout: int = 100) Removes all files from a dataverse record. record: dataverse_utils.dvdata.Study timeout: int Timeout in seconds main \u00b6 def main() Run this, obviously dataverse_utils.scripts.dv_ldc_uploader \u00b6 Auto download/upload LDC metadata and files. python3 uploadme.py LDC20201S01 . . . LDC2021T21 apikey parse \u00b6 def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser upload_meta \u00b6 def upload_meta(ldccat: str, url: str, key: str, dvs: str, verbose: bool = False, certchain: str = None) -> str Uploads metadata to target dataverse collection. Returns persistentId. ldccat : str Linguistic Data Consortium catalogue number url : str URL to base instance of Dataverse installation key : str API key dvs : str Target Dataverse collection short name certchain : str Path to LDC .PEM certificate chain main \u00b6 def main() -> None Uploads metadata and data to Dataverse collection/study respectively dataverse_utils.scripts.dv_pg_facet_date \u00b6 Reads the date from a Dataverse study and forces the facet sidebar to use that date by manually updating the Dataverse Postgres database. This must be run on the server that hosts a Dataverse installation, and the user must supply, at a minimum, the database password and a persistent ID to be read, as well as a date type. Requires two non-standard python libraries: psycopg2 (use psycopg2-binary to avoid installing from source) and requests. Psycopg2 is not part of the requirements for dataverse_utils because it is only used for the server portion of these utilities, and hence useless for them. parsely \u00b6 def parsely() -> argparse.ArgumentParser Command line argument parser parse_dtype \u00b6 def parse_dtype(dtype) -> str Returns correctly formatted date type string for Dataverse API dtype : str One of the allowable values from the parser write_old \u00b6 def write_old(data) -> None Writes older data to a tsv file. Assumes 4 values per item: id, authority, identifier, publicationdate. publicationdate is assumed to be a datetime.datetime instance. \u00b6 Arguments : data : list Postqres query output list (ie, data = cursor.fetchall()) write_sql \u00b6 def write_sql(data) -> None Write SQL to file get_datetime \u00b6 def get_datetime(datestr) -> (datetime.datetime, str) Return datetime from poorly formatted Dataverse dates string datestr : str Dataverse date returned by API fetch_date_api \u00b6 def fetch_date_api(url, key, pid, dtype) -> str Returns the requested date string from the Dataverse study record url : str Base URL of Dataverse installation key :str API key for Dataverse user pid : str Persistent identifier for Dataverse study dtype : str Date type required reindex \u00b6 def reindex(pid) -> dict Reindexes study in place. Localhost access only. pid : str PersistentId for Dataverse study main \u00b6 def main() The heart of the application dataverse_utils.scripts.dv_release \u00b6 Bulk release script for Dataverse. This is almost identical to the dryad2dataverse bulk releaser except that the defaults are changed to https://abacus.library.ubc.ca argp \u00b6 def argp() Parses the arguments from the command line. Returns arparse.ArgumentParser Dverse Objects \u00b6 class Dverse() An object representing a Dataverse installation __init__ \u00b6 def __init__(dvurl, apikey, dvs) Intializes Dataverse installation object. Arguments : dvurl : str. URL to base Dataverse installation (eg. \u2018https://abacus.library.ubc.ca\u2019) apikey : str. API key for Dataverse user dv : str. Short name of target Dataverse collection (eg. \u2018statcan\u2019) study_list \u00b6 @property def study_list() -> list Returns a list of all studies (published or not) in the Dataverse collection unreleased \u00b6 @property def unreleased(all_stud: list = None) -> list Finds only unreleased studies from a list of studies Arguments : all_stud : list. List of Dataverse studies. Defaults to output of Dverse.get_study_list() Study Objects \u00b6 class Study() Instance representing a Dataverse study __init__ \u00b6 def __init__(**kwargs) :kwarg dvurl: str. Base URL for Dataverse instance :kwarg apikey: str. API key for Dataverse user :kwarg pid: str. Persistent identifier for study :kwarg stime: int. Time between file lock checks. Default 10 :kwarg verbose: Verbose output. Default False status_ok \u00b6 def status_ok() Checks to see if study has a lock. Returns True if OK to continue, else False. release_me \u00b6 def release_me(interactive=False) Releases study and waits until it\u2019s unlocked before returning to the function main \u00b6 def main() The primary function. Will release all unreleased studies in the the target Dataverse collection, or selected studies as required. dataverse_utils.scripts.dv_del \u00b6 Dataverse Bulk Deleter Deletes unpublished studies at the command line delstudy \u00b6 def delstudy(dvurl, key, pid) Deletes Dataverse study dvurl : str Dataverse installation base URL key : str Dataverse user API key pid : str Dataverse collection study persistent identifier conf \u00b6 def conf(tex) Confirmation dialogue checker. Returns true if \u201cY\u201d or \u201cy\u201d getsize \u00b6 def getsize(dvurl, pid, key) Returns size of Dataverse study. Mostly here for debugging. dvurl : str Dataverse installation base URL pid : str Dataverse collection study persistent identifier key : str Dataverse user API key parsley \u00b6 def parsley() -> argparse.ArgumentParser Argument parser as separate function main \u00b6 def main() Command line bulk deleter dataverse_utils.scripts.dv_replace_licence \u00b6 Replace all licence in a study with one read from an external markdown file. This requires using a different API, the \u201csemantic metadata api\u201d https://guides.dataverse.org/en/5.6/developers/ dataset-semantic-metadata-api.html parsley \u00b6 def parsley() -> argparse.ArgumentParser() parse the command line replace_licence \u00b6 def replace_licence(hdl, lic, key, url='https://abacus.library.ubc.ca') Replace the licence for a dataverse study with persistent ID hdl. hdl : str Dataverse persistent ID lic : str Licence text in Markdown format key : str Dataverse API key url : str Dataverse installation base URL republish \u00b6 def republish(hdl, key, url='https://abacus.library.ubc.ca') Republish study without updating version hdl : str Persistent Id key : str Dataverse API key url : str Dataverse installation base URL print_stat \u00b6 def print_stat(rjson) Prints error status to stdout main \u00b6 def main() Main script function dataverse_utils.scripts.dv_upload_tsv \u00b6 Uploads data sets to a dataverse installation from the contents of a TSV (tab separated value) file. Metadata, file tags, paths, etc are all read from the TSV. parse \u00b6 def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser main \u00b6 def main() -> None Uploads data to an already existing Dataverse study dataverse_utils.scripts.dv_manifest_gen \u00b6 Creates a file manifest in tab separated value format which can be used with other dataverse_util library utilities and functions to upload files complete with metadata. parse \u00b6 def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser quotype \u00b6 def quotype(quote: str) -> int Parse quotation type for csv parser. returns csv quote constant. main \u00b6 def main() -> None The main function call dataverse_utils.dataverse_utils \u00b6 A collection of Dataverse utilities for file and metadata manipulation DvGeneralUploadError Objects \u00b6 class DvGeneralUploadError(Exception) Raised on non-200 URL response Md5Error Objects \u00b6 class Md5Error(Exception) Raised on md5 mismatch make_tsv \u00b6 def make_tsv(start_dir, in_list=None, def_tag='Data', inc_header=True, mime=False, quotype=csv.QUOTE_MINIMAL, **kwargs) -> str Recurses the tree for files and produces tsv output with with headers \u2018file\u2019, \u2018description\u2019, \u2018tags\u2019. The \u2018description\u2019 is the filename without an extension. Returns tsv as string. Arguments : start_dir : str Path to start directory in_list : list Input file list. Defaults to recursive walk of current directory. def_tag : str Default Dataverse tag (eg, Data, Documentation, etc) Separate tags with a comma: eg. (\u2018Data, 2016\u2019) inc_header : bool Include header row mime : bool Include automatically determined mimetype quotype - int integer value or csv quote type. Default = csv.QUOTE_MINIMAL Acceptable values: csv.QUOTE_MINIMAL / 0 csv.QUOTE_ALL / 1 csv.QUOTE_NONNUMERIC / 2 csv.QUOTE_NONE / 3 path - bool If true include a \u2018path\u2019 field so that you can type in a custom path instead of actually structuring your data dump_tsv \u00b6 def dump_tsv(start_dir, filename, in_list=None, **kwargs) Dumps output of make_tsv manifest to a file. Arguments : start_dir : str Path to start directory in_list : list List of files for which to create manifest entries. Will default to recursive directory crawl OPTIONAL KEYWORD ARGUMENTS def_tag : str Default Dataverse tag (eg, Data, Documentation, etc) Separate tags with an easily splitable character: eg. (\u2018Data, 2016\u2019) - Default - \u2018Data\u2019 inc_header : bool Include header for tsv. Default : True quotype - int integer value or csv quote type. Default : csv.QUOTE_MINIMAL Acceptable values: csv.QUOTE_MINIMAL / 0 csv.QUOTE_ALL / 1 csv.QUOTE_NONNUMERIC / 2 csv.QUOTE_NONE / 3 file_path \u00b6 def file_path(fpath, trunc='') -> str Create relative file path from full path string file_path(\u2018/tmp/Data/2011/excelfile.xlsx\u2019, \u2018/tmp/\u2019) \u2018Data/2011\u2019 file_path(\u2018/tmp/Data/2011/excelfile.xlsx\u2019, \u2018/tmp\u2019) \u2018Data/2011\u2019 Arguments : fpath : str File location (ie, complete path) trunc : str Leftmost portion of path to remove check_lock \u00b6 def check_lock(dv_url, study, apikey) -> bool Checks study lock status; returns True if locked. Arguments : dvurl : str URL of Dataverse installation study - str Persistent ID of study apikey : str API key for user force_notab_unlock \u00b6 def force_notab_unlock(study, dv_url, fid, apikey, try_uningest=True) -> int Forcibly unlocks and uningests to prevent tabular file processing. Required if mime and filename spoofing is not sufficient. Returns 0 if unlocked, file id if locked (and then unlocked). Arguments : study : str Persistent indentifer of study dv_url : str URL to base Dataverse installation fid : str File ID for file object apikey : str API key for user try_uningest : bool Try to uningest the file that was locked. - Default - True uningest_file \u00b6 def uningest_file(dv_url, fid, apikey, study='n/a') Tries to uningest a file that has been ingested. Requires superuser API key. Arguments : dv_url : str URL to base Dataverse installation fid : int or str File ID of file to uningest apikey : str API key for superuser study : str Optional handle parameter for log messages upload_file \u00b6 def upload_file(fpath, hdl, **kwargs) Uploads file to Dataverse study and sets file metadata and tags. Arguments : fpath : str file location (ie, complete path) hdl : str Dataverse persistent ID for study (handle or DOI) kwargs : dict other parameters. Acceptable keywords and contents are: dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user descr : str OPTIONAL file description md5 : str OPTIONAL md5sum for file checking tags : list OPTIONAL list of text file tags. Eg [\u2018Data\u2019, \u2018June 2020\u2019] dirlabel : str OPTIONAL Unix style relative pathname for Dataverse file path: eg: path/to/file/ nowait : bool OPTIONAL Force a file unlock and uningest instead of waiting for processing to finish trunc : str OPTIONAL Leftmost portion of path to remove rest : bool OPTIONAL Restrict file. Defaults to false unless True supplied mimetype : str OPTIONAL Mimetype of file. Useful if using File Previewers. Mimetype for zip files (application/zip) will be ignored to circumvent Dataverse\u2019s automatic unzipping function. label : str OPTIONAL If included in kwargs, this value will be used for the label timeout : int OPTIONAL Timeout in seconds override : bool OPTIONAL Ignore NOTAB (ie, NOTAB = []) timeout = int OPTIONAL Timeout in seconds restrict_file \u00b6 def restrict_file(**kwargs) Restrict file in Dataverse study. Arguments : kwargs : dict other parameters. Acceptable keywords and contents are: One of pid or fid is required pid : str file persistent ID fid : str file database ID dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user rest : bool On True, restrict. Default True upload_from_tsv \u00b6 def upload_from_tsv(fil, hdl, **kwargs) Utility for bulk uploading. Assumes fil is formatted as tsv with headers \u2018file\u2019, \u2018description\u2019, \u2018tags\u2019. \u2018tags\u2019 field will be split on commas. Arguments : fil : filelike object Open file object or io.IOStream() hdl : str Dataverse persistent ID for study (handle or DOI) trunc : str Leftmost portion of Dataverse study file path to remove. - eg - trunc =\u2019/home/user/\u2019 if the tsv field is \u2018/home/user/Data/ASCII\u2019 would set the path for that line of the tsv to \u2018Data/ASCII\u2019. Defaults to None. kwargs : dict other parameters. Acceptable keywords and contents are: dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user rest : bool On True, restrict access. Default False dataverse_utils.ldc \u00b6 Creates dataverse JSON from Linguistic Data Consortium website page. Ldc Objects \u00b6 class Ldc(ds.Serializer) An LDC item (eg, LDC2021T01) __init__ \u00b6 def __init__(ldc, cert=None) Returns a dict with keys created from an LDC catalogue web page. Arguments : ldc : str Linguistic Consortium Catalogue Number (eg. \u2018LDC2015T05\u2019. This is what forms the last part of the LDC catalogue URL. cert : str Path to certificate chain; LDC has had a problem with intermediate certificates, so you can download the chain with a browser and supply a path to the .pem with this parameter ldcJson \u00b6 @property def ldcJson() Returns a JSON based on the LDC web page scraping dryadJson \u00b6 @property def dryadJson() LDC metadata in Dryad JSON format dvJson \u00b6 @property def dvJson() LDC metadata in Dataverse JSON format embargo \u00b6 @property def embargo() Boolean indicating embargo status fileJson \u00b6 @property def fileJson(timeout=45) Returns False: No attached files possible at LDC files \u00b6 @property def files() Returns None. No files possible fetch_record \u00b6 def fetch_record(url=None, timeout=45) Downloads record from LDC website make_ldc_json \u00b6 def make_ldc_json() Returns a dict with keys created from an LDC catalogue web page. name_parser \u00b6 @staticmethod def name_parser(name) Returns lastName/firstName JSON snippet from name Arguments : name : str A name make_dryad_json \u00b6 def make_dryad_json(ldc=None) Creates a Dryad-style dict from an LDC dictionary Arguments : ldc : dict Dictionary containing LDC data. Defaults to self.ldcJson find_block_index \u00b6 @staticmethod def find_block_index(dvjson, key) Finds the index number of an item in Dataverse\u2019s idiotic JSON list Arguments : dvjson : dict Dataverse JSON key : str key for which to find list index make_dv_json \u00b6 def make_dv_json(ldc=None) Returns complete Dataverse JSON Arguments : ldc : dict LDC dictionary. Defaults to self.ldcJson upload_metadata \u00b6 def upload_metadata(**kwargs) -> dict Uploads metadata to dataverse Returns json from connection attempt. Arguments : kwargs: url : str base url to Dataverse key : str api key dv : str Dataverse to which it is being uploaded","title":"API reference"},{"location":"api_ref/#api-reference","text":"","title":"API Reference"},{"location":"api_ref/#dataverse_utils","text":"Generalized dataverse utilities. Note that import dataverse_utils is the equivalent of import dataverse_utils.dataverse_utils","title":"dataverse_utils"},{"location":"api_ref/#dataverse_utilsdvdata","text":"Dataverse studies and files","title":"dataverse_utils.dvdata"},{"location":"api_ref/#study-objects","text":"class Study(dict) Dataverse record. Dataverse study records are pure metadata so this is represented with a dictionary.","title":"Study Objects"},{"location":"api_ref/#__init__","text":"def __init__(pid: str, url: str, key: str, **kwargs) pid : str Record persistent identifier: hdl or doi url : str Base URL to host Dataverse instance key : str Dataverse API key with downloader privileges","title":"__init__"},{"location":"api_ref/#get_version","text":"@classmethod def get_version(cls, url: str, timeout: int = 100) -> float Returns a float representing a Dataverse version number. Floating point value composed of: float(f\u2019{major_version}.{minor_verson:03d}{patch:03d}\u2019) ie, version 5.9.2 would be 5.009002 url : str URL of base Dataverse instance. eg: \u2018https://abacus.library.ubc.ca\u2019 timeout : int Request timeout in seconds","title":"get_version"},{"location":"api_ref/#set_version","text":"def set_version(url: str, timeout: int = 100) -> None Sets self[\u2018target_version\u2019] to appropriate integer value AND formats self[\u2018upload_json\u2019] to correct JSON format url : str URL of target Dataverse instance timeout : int request timeout in seconds","title":"set_version"},{"location":"api_ref/#fix_licence","text":"def fix_licence() -> None With Dataverse v5.10+, a licence type of \u2018NONE\u2019 is now forbidden. Now, as per https://guides.dataverse.org/en/5.14/api/sword.html ?highlight=invalid%20license , non-standard licences may be replaced with None. This function edits the same Study object in place , so returns nothing.","title":"fix_licence"},{"location":"api_ref/#production_location","text":"def production_location() -> None Changes \u201cmultiple\u201d to True where typeName == \u2018productionPlace\u2019 in Study[\u2018upload_json\u2019] Changes are done in place . This change came into effect with Dataverse v5.13","title":"production_location"},{"location":"api_ref/#file-objects","text":"class File(dict) Class representing a file on a Dataverse instance","title":"File Objects"},{"location":"api_ref/#__init___1","text":"def __init__(url: str, key: str, **kwargs) url : str Base URL to host Dataverse instance key : str Dataverse API key with downloader privileges id : int or str File identifier; can be a file ID or PID args : list kwargs : dict To initialize correctly, pass a value from Study[\u2018file_info\u2019]. Eg: File(\u2018https://test.invalid\u2019, \u2018ABC123\u2019, **Study_instance[\u2018file_info\u2019][0])","title":"__init__"},{"location":"api_ref/#download_file","text":"def download_file() Downloads the file to a temporary location. Data will be in the ORIGINAL format, not Dataverse-processed TSVs","title":"download_file"},{"location":"api_ref/#del_tempfile","text":"def del_tempfile() Delete tempfile if it exists","title":"del_tempfile"},{"location":"api_ref/#produce_digest","text":"def produce_digest(prot: str = 'md5', blocksize: int = 2**16) -> str Returns hex digest for object fname : str Path to a file object prot : str Hash type. Supported hashes: 'sha1', 'sha224', 'sha256', 'sha384', 'sha512', 'blake2b', 'blake2s', 'md5'. Default: 'md5' blocksize : int Read block size in bytes","title":"produce_digest"},{"location":"api_ref/#verify","text":"def verify() -> None Compares checksum with stated checksum","title":"verify"},{"location":"api_ref/#dataverse_utilsscriptsdv_record_copy","text":"Copies a dataverse record to collection OR copies a record to an existing PID. That way all you have to do is edit a few fields in the GUI instead of painfully editing JSON or painfully using the Dataverse GUI.","title":"dataverse_utils.scripts.dv_record_copy"},{"location":"api_ref/#parsley","text":"def parsley() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parsley"},{"location":"api_ref/#main","text":"def main() You know what this does","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_study_migrator","text":"Copies an entire record and migrates it including the data","title":"dataverse_utils.scripts.dv_study_migrator"},{"location":"api_ref/#parsley_1","text":"def parsley() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parsley"},{"location":"api_ref/#upload_file_to_target","text":"def upload_file_to_target(indict: dict, pid, source_url, source_key, target_url, target_key) Uploads a single file with metadata to a dataverse record","title":"upload_file_to_target"},{"location":"api_ref/#remove_target_files","text":"def remove_target_files(record: dataverse_utils.dvdata.Study, timeout: int = 100) Removes all files from a dataverse record. record: dataverse_utils.dvdata.Study timeout: int Timeout in seconds","title":"remove_target_files"},{"location":"api_ref/#main_1","text":"def main() Run this, obviously","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_ldc_uploader","text":"Auto download/upload LDC metadata and files. python3 uploadme.py LDC20201S01 . . . LDC2021T21 apikey","title":"dataverse_utils.scripts.dv_ldc_uploader"},{"location":"api_ref/#parse","text":"def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parse"},{"location":"api_ref/#upload_meta","text":"def upload_meta(ldccat: str, url: str, key: str, dvs: str, verbose: bool = False, certchain: str = None) -> str Uploads metadata to target dataverse collection. Returns persistentId. ldccat : str Linguistic Data Consortium catalogue number url : str URL to base instance of Dataverse installation key : str API key dvs : str Target Dataverse collection short name certchain : str Path to LDC .PEM certificate chain","title":"upload_meta"},{"location":"api_ref/#main_2","text":"def main() -> None Uploads metadata and data to Dataverse collection/study respectively","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_pg_facet_date","text":"Reads the date from a Dataverse study and forces the facet sidebar to use that date by manually updating the Dataverse Postgres database. This must be run on the server that hosts a Dataverse installation, and the user must supply, at a minimum, the database password and a persistent ID to be read, as well as a date type. Requires two non-standard python libraries: psycopg2 (use psycopg2-binary to avoid installing from source) and requests. Psycopg2 is not part of the requirements for dataverse_utils because it is only used for the server portion of these utilities, and hence useless for them.","title":"dataverse_utils.scripts.dv_pg_facet_date"},{"location":"api_ref/#parsely","text":"def parsely() -> argparse.ArgumentParser Command line argument parser","title":"parsely"},{"location":"api_ref/#parse_dtype","text":"def parse_dtype(dtype) -> str Returns correctly formatted date type string for Dataverse API dtype : str One of the allowable values from the parser","title":"parse_dtype"},{"location":"api_ref/#write_old","text":"def write_old(data) -> None Writes older data to a tsv file. Assumes 4 values per item: id, authority, identifier, publicationdate.","title":"write_old"},{"location":"api_ref/#publicationdate-is-assumed-to-be-a-datetimedatetime-instance","text":"Arguments : data : list Postqres query output list (ie, data = cursor.fetchall())","title":"publicationdate is assumed to be a datetime.datetime instance."},{"location":"api_ref/#write_sql","text":"def write_sql(data) -> None Write SQL to file","title":"write_sql"},{"location":"api_ref/#get_datetime","text":"def get_datetime(datestr) -> (datetime.datetime, str) Return datetime from poorly formatted Dataverse dates string datestr : str Dataverse date returned by API","title":"get_datetime"},{"location":"api_ref/#fetch_date_api","text":"def fetch_date_api(url, key, pid, dtype) -> str Returns the requested date string from the Dataverse study record url : str Base URL of Dataverse installation key :str API key for Dataverse user pid : str Persistent identifier for Dataverse study dtype : str Date type required","title":"fetch_date_api"},{"location":"api_ref/#reindex","text":"def reindex(pid) -> dict Reindexes study in place. Localhost access only. pid : str PersistentId for Dataverse study","title":"reindex"},{"location":"api_ref/#main_3","text":"def main() The heart of the application","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_release","text":"Bulk release script for Dataverse. This is almost identical to the dryad2dataverse bulk releaser except that the defaults are changed to https://abacus.library.ubc.ca","title":"dataverse_utils.scripts.dv_release"},{"location":"api_ref/#argp","text":"def argp() Parses the arguments from the command line. Returns arparse.ArgumentParser","title":"argp"},{"location":"api_ref/#dverse-objects","text":"class Dverse() An object representing a Dataverse installation","title":"Dverse Objects"},{"location":"api_ref/#__init___2","text":"def __init__(dvurl, apikey, dvs) Intializes Dataverse installation object. Arguments : dvurl : str. URL to base Dataverse installation (eg. \u2018https://abacus.library.ubc.ca\u2019) apikey : str. API key for Dataverse user dv : str. Short name of target Dataverse collection (eg. \u2018statcan\u2019)","title":"__init__"},{"location":"api_ref/#study_list","text":"@property def study_list() -> list Returns a list of all studies (published or not) in the Dataverse collection","title":"study_list"},{"location":"api_ref/#unreleased","text":"@property def unreleased(all_stud: list = None) -> list Finds only unreleased studies from a list of studies Arguments : all_stud : list. List of Dataverse studies. Defaults to output of Dverse.get_study_list()","title":"unreleased"},{"location":"api_ref/#study-objects_1","text":"class Study() Instance representing a Dataverse study","title":"Study Objects"},{"location":"api_ref/#__init___3","text":"def __init__(**kwargs) :kwarg dvurl: str. Base URL for Dataverse instance :kwarg apikey: str. API key for Dataverse user :kwarg pid: str. Persistent identifier for study :kwarg stime: int. Time between file lock checks. Default 10 :kwarg verbose: Verbose output. Default False","title":"__init__"},{"location":"api_ref/#status_ok","text":"def status_ok() Checks to see if study has a lock. Returns True if OK to continue, else False.","title":"status_ok"},{"location":"api_ref/#release_me","text":"def release_me(interactive=False) Releases study and waits until it\u2019s unlocked before returning to the function","title":"release_me"},{"location":"api_ref/#main_4","text":"def main() The primary function. Will release all unreleased studies in the the target Dataverse collection, or selected studies as required.","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_del","text":"Dataverse Bulk Deleter Deletes unpublished studies at the command line","title":"dataverse_utils.scripts.dv_del"},{"location":"api_ref/#delstudy","text":"def delstudy(dvurl, key, pid) Deletes Dataverse study dvurl : str Dataverse installation base URL key : str Dataverse user API key pid : str Dataverse collection study persistent identifier","title":"delstudy"},{"location":"api_ref/#conf","text":"def conf(tex) Confirmation dialogue checker. Returns true if \u201cY\u201d or \u201cy\u201d","title":"conf"},{"location":"api_ref/#getsize","text":"def getsize(dvurl, pid, key) Returns size of Dataverse study. Mostly here for debugging. dvurl : str Dataverse installation base URL pid : str Dataverse collection study persistent identifier key : str Dataverse user API key","title":"getsize"},{"location":"api_ref/#parsley_2","text":"def parsley() -> argparse.ArgumentParser Argument parser as separate function","title":"parsley"},{"location":"api_ref/#main_5","text":"def main() Command line bulk deleter","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_replace_licence","text":"Replace all licence in a study with one read from an external markdown file. This requires using a different API, the \u201csemantic metadata api\u201d https://guides.dataverse.org/en/5.6/developers/ dataset-semantic-metadata-api.html","title":"dataverse_utils.scripts.dv_replace_licence"},{"location":"api_ref/#parsley_3","text":"def parsley() -> argparse.ArgumentParser() parse the command line","title":"parsley"},{"location":"api_ref/#replace_licence","text":"def replace_licence(hdl, lic, key, url='https://abacus.library.ubc.ca') Replace the licence for a dataverse study with persistent ID hdl. hdl : str Dataverse persistent ID lic : str Licence text in Markdown format key : str Dataverse API key url : str Dataverse installation base URL","title":"replace_licence"},{"location":"api_ref/#republish","text":"def republish(hdl, key, url='https://abacus.library.ubc.ca') Republish study without updating version hdl : str Persistent Id key : str Dataverse API key url : str Dataverse installation base URL","title":"republish"},{"location":"api_ref/#print_stat","text":"def print_stat(rjson) Prints error status to stdout","title":"print_stat"},{"location":"api_ref/#main_6","text":"def main() Main script function","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_upload_tsv","text":"Uploads data sets to a dataverse installation from the contents of a TSV (tab separated value) file. Metadata, file tags, paths, etc are all read from the TSV.","title":"dataverse_utils.scripts.dv_upload_tsv"},{"location":"api_ref/#parse_1","text":"def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parse"},{"location":"api_ref/#main_7","text":"def main() -> None Uploads data to an already existing Dataverse study","title":"main"},{"location":"api_ref/#dataverse_utilsscriptsdv_manifest_gen","text":"Creates a file manifest in tab separated value format which can be used with other dataverse_util library utilities and functions to upload files complete with metadata.","title":"dataverse_utils.scripts.dv_manifest_gen"},{"location":"api_ref/#parse_2","text":"def parse() -> argparse.ArgumentParser() Parses the arguments from the command line. Returns argparse.ArgumentParser","title":"parse"},{"location":"api_ref/#quotype","text":"def quotype(quote: str) -> int Parse quotation type for csv parser. returns csv quote constant.","title":"quotype"},{"location":"api_ref/#main_8","text":"def main() -> None The main function call","title":"main"},{"location":"api_ref/#dataverse_utilsdataverse_utils","text":"A collection of Dataverse utilities for file and metadata manipulation","title":"dataverse_utils.dataverse_utils"},{"location":"api_ref/#dvgeneraluploaderror-objects","text":"class DvGeneralUploadError(Exception) Raised on non-200 URL response","title":"DvGeneralUploadError Objects"},{"location":"api_ref/#md5error-objects","text":"class Md5Error(Exception) Raised on md5 mismatch","title":"Md5Error Objects"},{"location":"api_ref/#make_tsv","text":"def make_tsv(start_dir, in_list=None, def_tag='Data', inc_header=True, mime=False, quotype=csv.QUOTE_MINIMAL, **kwargs) -> str Recurses the tree for files and produces tsv output with with headers \u2018file\u2019, \u2018description\u2019, \u2018tags\u2019. The \u2018description\u2019 is the filename without an extension. Returns tsv as string. Arguments : start_dir : str Path to start directory in_list : list Input file list. Defaults to recursive walk of current directory. def_tag : str Default Dataverse tag (eg, Data, Documentation, etc) Separate tags with a comma: eg. (\u2018Data, 2016\u2019) inc_header : bool Include header row mime : bool Include automatically determined mimetype quotype - int integer value or csv quote type. Default = csv.QUOTE_MINIMAL Acceptable values: csv.QUOTE_MINIMAL / 0 csv.QUOTE_ALL / 1 csv.QUOTE_NONNUMERIC / 2 csv.QUOTE_NONE / 3 path - bool If true include a \u2018path\u2019 field so that you can type in a custom path instead of actually structuring your data","title":"make_tsv"},{"location":"api_ref/#dump_tsv","text":"def dump_tsv(start_dir, filename, in_list=None, **kwargs) Dumps output of make_tsv manifest to a file. Arguments : start_dir : str Path to start directory in_list : list List of files for which to create manifest entries. Will default to recursive directory crawl OPTIONAL KEYWORD ARGUMENTS def_tag : str Default Dataverse tag (eg, Data, Documentation, etc) Separate tags with an easily splitable character: eg. (\u2018Data, 2016\u2019) - Default - \u2018Data\u2019 inc_header : bool Include header for tsv. Default : True quotype - int integer value or csv quote type. Default : csv.QUOTE_MINIMAL Acceptable values: csv.QUOTE_MINIMAL / 0 csv.QUOTE_ALL / 1 csv.QUOTE_NONNUMERIC / 2 csv.QUOTE_NONE / 3","title":"dump_tsv"},{"location":"api_ref/#file_path","text":"def file_path(fpath, trunc='') -> str Create relative file path from full path string file_path(\u2018/tmp/Data/2011/excelfile.xlsx\u2019, \u2018/tmp/\u2019) \u2018Data/2011\u2019 file_path(\u2018/tmp/Data/2011/excelfile.xlsx\u2019, \u2018/tmp\u2019) \u2018Data/2011\u2019 Arguments : fpath : str File location (ie, complete path) trunc : str Leftmost portion of path to remove","title":"file_path"},{"location":"api_ref/#check_lock","text":"def check_lock(dv_url, study, apikey) -> bool Checks study lock status; returns True if locked. Arguments : dvurl : str URL of Dataverse installation study - str Persistent ID of study apikey : str API key for user","title":"check_lock"},{"location":"api_ref/#force_notab_unlock","text":"def force_notab_unlock(study, dv_url, fid, apikey, try_uningest=True) -> int Forcibly unlocks and uningests to prevent tabular file processing. Required if mime and filename spoofing is not sufficient. Returns 0 if unlocked, file id if locked (and then unlocked). Arguments : study : str Persistent indentifer of study dv_url : str URL to base Dataverse installation fid : str File ID for file object apikey : str API key for user try_uningest : bool Try to uningest the file that was locked. - Default - True","title":"force_notab_unlock"},{"location":"api_ref/#uningest_file","text":"def uningest_file(dv_url, fid, apikey, study='n/a') Tries to uningest a file that has been ingested. Requires superuser API key. Arguments : dv_url : str URL to base Dataverse installation fid : int or str File ID of file to uningest apikey : str API key for superuser study : str Optional handle parameter for log messages","title":"uningest_file"},{"location":"api_ref/#upload_file","text":"def upload_file(fpath, hdl, **kwargs) Uploads file to Dataverse study and sets file metadata and tags. Arguments : fpath : str file location (ie, complete path) hdl : str Dataverse persistent ID for study (handle or DOI) kwargs : dict other parameters. Acceptable keywords and contents are: dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user descr : str OPTIONAL file description md5 : str OPTIONAL md5sum for file checking tags : list OPTIONAL list of text file tags. Eg [\u2018Data\u2019, \u2018June 2020\u2019] dirlabel : str OPTIONAL Unix style relative pathname for Dataverse file path: eg: path/to/file/ nowait : bool OPTIONAL Force a file unlock and uningest instead of waiting for processing to finish trunc : str OPTIONAL Leftmost portion of path to remove rest : bool OPTIONAL Restrict file. Defaults to false unless True supplied mimetype : str OPTIONAL Mimetype of file. Useful if using File Previewers. Mimetype for zip files (application/zip) will be ignored to circumvent Dataverse\u2019s automatic unzipping function. label : str OPTIONAL If included in kwargs, this value will be used for the label timeout : int OPTIONAL Timeout in seconds override : bool OPTIONAL Ignore NOTAB (ie, NOTAB = []) timeout = int OPTIONAL Timeout in seconds","title":"upload_file"},{"location":"api_ref/#restrict_file","text":"def restrict_file(**kwargs) Restrict file in Dataverse study. Arguments : kwargs : dict other parameters. Acceptable keywords and contents are: One of pid or fid is required pid : str file persistent ID fid : str file database ID dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user rest : bool On True, restrict. Default True","title":"restrict_file"},{"location":"api_ref/#upload_from_tsv","text":"def upload_from_tsv(fil, hdl, **kwargs) Utility for bulk uploading. Assumes fil is formatted as tsv with headers \u2018file\u2019, \u2018description\u2019, \u2018tags\u2019. \u2018tags\u2019 field will be split on commas. Arguments : fil : filelike object Open file object or io.IOStream() hdl : str Dataverse persistent ID for study (handle or DOI) trunc : str Leftmost portion of Dataverse study file path to remove. - eg - trunc =\u2019/home/user/\u2019 if the tsv field is \u2018/home/user/Data/ASCII\u2019 would set the path for that line of the tsv to \u2018Data/ASCII\u2019. Defaults to None. kwargs : dict other parameters. Acceptable keywords and contents are: dv : str REQUIRED url to base Dataverse installation - eg - \u2018https://abacus.library.ubc.ca\u2019 apikey : str REQUIRED API key for user rest : bool On True, restrict access. Default False","title":"upload_from_tsv"},{"location":"api_ref/#dataverse_utilsldc","text":"Creates dataverse JSON from Linguistic Data Consortium website page.","title":"dataverse_utils.ldc"},{"location":"api_ref/#ldc-objects","text":"class Ldc(ds.Serializer) An LDC item (eg, LDC2021T01)","title":"Ldc Objects"},{"location":"api_ref/#__init___4","text":"def __init__(ldc, cert=None) Returns a dict with keys created from an LDC catalogue web page. Arguments : ldc : str Linguistic Consortium Catalogue Number (eg. \u2018LDC2015T05\u2019. This is what forms the last part of the LDC catalogue URL. cert : str Path to certificate chain; LDC has had a problem with intermediate certificates, so you can download the chain with a browser and supply a path to the .pem with this parameter","title":"__init__"},{"location":"api_ref/#ldcjson","text":"@property def ldcJson() Returns a JSON based on the LDC web page scraping","title":"ldcJson"},{"location":"api_ref/#dryadjson","text":"@property def dryadJson() LDC metadata in Dryad JSON format","title":"dryadJson"},{"location":"api_ref/#dvjson","text":"@property def dvJson() LDC metadata in Dataverse JSON format","title":"dvJson"},{"location":"api_ref/#embargo","text":"@property def embargo() Boolean indicating embargo status","title":"embargo"},{"location":"api_ref/#filejson","text":"@property def fileJson(timeout=45) Returns False: No attached files possible at LDC","title":"fileJson"},{"location":"api_ref/#files","text":"@property def files() Returns None. No files possible","title":"files"},{"location":"api_ref/#fetch_record","text":"def fetch_record(url=None, timeout=45) Downloads record from LDC website","title":"fetch_record"},{"location":"api_ref/#make_ldc_json","text":"def make_ldc_json() Returns a dict with keys created from an LDC catalogue web page.","title":"make_ldc_json"},{"location":"api_ref/#name_parser","text":"@staticmethod def name_parser(name) Returns lastName/firstName JSON snippet from name Arguments : name : str A name","title":"name_parser"},{"location":"api_ref/#make_dryad_json","text":"def make_dryad_json(ldc=None) Creates a Dryad-style dict from an LDC dictionary Arguments : ldc : dict Dictionary containing LDC data. Defaults to self.ldcJson","title":"make_dryad_json"},{"location":"api_ref/#find_block_index","text":"@staticmethod def find_block_index(dvjson, key) Finds the index number of an item in Dataverse\u2019s idiotic JSON list Arguments : dvjson : dict Dataverse JSON key : str key for which to find list index","title":"find_block_index"},{"location":"api_ref/#make_dv_json","text":"def make_dv_json(ldc=None) Returns complete Dataverse JSON Arguments : ldc : dict LDC dictionary. Defaults to self.ldcJson","title":"make_dv_json"},{"location":"api_ref/#upload_metadata","text":"def upload_metadata(**kwargs) -> dict Uploads metadata to dataverse Returns json from connection attempt. Arguments : kwargs: url : str base url to Dataverse key : str api key dv : str Dataverse to which it is being uploaded","title":"upload_metadata"},{"location":"credits/","text":"Credits \u00b6 Dataverse_utils and their associated command line programs were written by Paul Lesack . Testing and UI suggestions from Jeremy Buhler . This is a product of the University of British Columbia Library Research Commons .","title":"Credits"},{"location":"credits/#credits","text":"Dataverse_utils and their associated command line programs were written by Paul Lesack . Testing and UI suggestions from Jeremy Buhler . This is a product of the University of British Columbia Library Research Commons .","title":"Credits"},{"location":"faq/","text":"Frequently asked questions \u00b6 \u201cFrequently\u201d may be relative. 1. I\u2019m using Windows and the scripts don\u2019t seem to be working/recognized by [choice of command line interface here] \u00b6 There are (at least) four different ways to get some sort of command line access. The traditional command line, PowerShell, via SSH and Git bash. That\u2019s not even including the linux subsystem. The document on Windows script troubles gives common solutions. 2. I am using Windows [7-10]. I\u2019ve installed via pip using a virtual environment, but they don\u2019t use my virtual environment\u2019s Python. \u00b6 What seems like a simple problem is surprisingly complex, as outlined here: https://matthew-brett.github.io/pydagogue/installing_scripts.html . This is further complicated by some other factors. If you have only one Python installation on your machine, you are probably OK. Mind you, if you\u2019re looking at this and that\u2019s the case, maybe I\u2019m wrong. If you have multiple Pythons, you can try changing your environment variables to point to the correct Python. If you are using ArcGIS products, ArcGIS may write items into your Windows registry which will associate any .py file with it\u2019s grossly outdated Python 2.7, or just the wrong Python. More specifically: Computer\\HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command in the Windows registry. Unfortunately, the Windows computer that I have available for testing (as I normally use Linux or Mac) does not have an administrator account, so I can\u2019t confirm that changing this key will work (although there\u2019s no reason to believe it won\u2019t). This is a pain. Is there something less irritating that would work? \u00b6 Yes, there is. You can still run the scripts manually. There are two options for this. Download the repository via git to a convenient place and use the files in the scripts/ directory Point your %PATH% to where the scripts are installed. To find out where they are installed: TLDR: version: Point your %PATH% (and use first part of the path) to point to your [venv]\\Scripts directory, because they\u2019re probably there. Long winded instructions/explanation: Start a Python session: import sys sys.path [x for x in sys.path if x.endswith(\u2018site-packages\u2019)] The location of the scripts will be written in [whatever the output of sys.path]/dataverse_utils[somestuff]egg-info/installed-files.txt , usually three levels up in the scripts directory. Ironically, this is also the location of the activate portion of the comand required to start a virtual environment (if you are using a virtual environment). For some background on this, venv in Linux and Mac versions of Python uses bin , and reserves scripts for the scripts directory. Windows, however, uses Scripts for the venv module, and to make it worse it\u2019s not usually case sensitive, so anything in scripts gets put into Scripts .","title":"FAQ"},{"location":"faq/#frequently-asked-questions","text":"\u201cFrequently\u201d may be relative.","title":"Frequently asked questions"},{"location":"faq/#1-im-using-windows-and-the-scripts-dont-seem-to-be-workingrecognized-by-choice-of-command-line-interface-here","text":"There are (at least) four different ways to get some sort of command line access. The traditional command line, PowerShell, via SSH and Git bash. That\u2019s not even including the linux subsystem. The document on Windows script troubles gives common solutions.","title":"1. I'm using Windows and the scripts don't seem to be working/recognized by [choice of command line interface here]"},{"location":"faq/#2-i-am-using-windows-7-10-ive-installed-via-pip-using-a-virtual-environment-but-they-dont-use-my-virtual-environments-python","text":"What seems like a simple problem is surprisingly complex, as outlined here: https://matthew-brett.github.io/pydagogue/installing_scripts.html . This is further complicated by some other factors. If you have only one Python installation on your machine, you are probably OK. Mind you, if you\u2019re looking at this and that\u2019s the case, maybe I\u2019m wrong. If you have multiple Pythons, you can try changing your environment variables to point to the correct Python. If you are using ArcGIS products, ArcGIS may write items into your Windows registry which will associate any .py file with it\u2019s grossly outdated Python 2.7, or just the wrong Python. More specifically: Computer\\HKEY_CLASSES_ROOT\\Python.File\\shell\\open\\command in the Windows registry. Unfortunately, the Windows computer that I have available for testing (as I normally use Linux or Mac) does not have an administrator account, so I can\u2019t confirm that changing this key will work (although there\u2019s no reason to believe it won\u2019t).","title":"2. I am using Windows [7-10]. I've installed via pip using a virtual environment, but they don't use my virtual environment's Python."},{"location":"faq/#this-is-a-pain-is-there-something-less-irritating-that-would-work","text":"Yes, there is. You can still run the scripts manually. There are two options for this. Download the repository via git to a convenient place and use the files in the scripts/ directory Point your %PATH% to where the scripts are installed. To find out where they are installed: TLDR: version: Point your %PATH% (and use first part of the path) to point to your [venv]\\Scripts directory, because they\u2019re probably there. Long winded instructions/explanation: Start a Python session: import sys sys.path [x for x in sys.path if x.endswith(\u2018site-packages\u2019)] The location of the scripts will be written in [whatever the output of sys.path]/dataverse_utils[somestuff]egg-info/installed-files.txt , usually three levels up in the scripts directory. Ironically, this is also the location of the activate portion of the comand required to start a virtual environment (if you are using a virtual environment). For some background on this, venv in Linux and Mac versions of Python uses bin , and reserves scripts for the scripts directory. Windows, however, uses Scripts for the venv module, and to make it worse it\u2019s not usually case sensitive, so anything in scripts gets put into Scripts .","title":"This is a pain. Is there something less irritating that would work?"},{"location":"scripts/","text":"Console utilities \u00b6 code { white-space : pre-wrap !important; } These utilities are available at the command line/command prompt and don\u2019t require any Python knowledge except how to install a Python library via pip, as outlined in the overview document. Once installed via pip, the scripts will be available via the command line and will not require calling Python explicitly. That is, they can be called from the command line directly. For example: dv_tsv_manifest is all you will need to type. Note that these programs have been primarily tested on Linux and MacOS, with Windows a tertiary priority . Windows is notable for its unusual file handling, so, as the MIT licence stipulates, there is no warranty as to the suitability for a particular purpose. In alphabetical order: dv_del \u00b6 This is bulk deletion utility for unpublished studies (or even single studies). It\u2019s useful when your automated procedures have gone wrong, or if you don\u2019t feel like navigating through many menus. Note the -i switch which can ask for manual confirmation of deletions. Usage usage: dv_del [-h] -k KEY [-d DATAVERSE | -p PID] [-i] [-u DVURL] [--version] Delete draft studies from a Dataverse collection options: -h, --help show this help message and exit -k KEY, --key KEY Dataverse user API key -d DATAVERSE, --dataverse DATAVERSE Dataverse collection short name from which to delete all draft records. eg. \"ldc\" -p PID, --persistentId PID Handle or DOI to delete in format hdl:11272.1/FK2/12345 -i, --interactive Confirm each study deletion -u DVURL, --url DVURL URL to base Dataverse installation --version Show version number and exit dv_ldc_uploader \u00b6 This is a very specialized utility which will scrape metadata from the Linguistic Data Consortium (LDC) and create a metadata record in a Dataverse. The LDC does not have an API, so the metadata is scraped from their web site. This means that the metadata may not be quite as controlled as that which comes from an API. Data from the LDC website is converted to Dryad -style JSON via dataverse_utils.ldc via the use of the dryad2dataverse library. There are two main methods of use for this utility: Multiple metadata uploads. Multiple LDC record numbers can be supplied and a study without files will be created for each one. If a TSV file with file information is upplied via the -t or --tsv switch, the utility will upload a single LDC study and upload the contents of the tsv file to the created record. Important note \u00b6 2024-09 Update The problem listed below seems to have resolved itself by September 2024. It\u2019s not clear whether this was a certifi issue or an issue with LDC\u2019s certificates. In any case, if you are having problems with LDC website, use the -c switch and follow the procedure below. As of early 2023, the LDC website is not supported by certifi . You will need to manually supply a certificate chain to use the utility. To obtain the certificate chain (in Firefox) perform the following steps: Select Tools/Page Info In the Security tab, select View Certificate Scroll to \u201cPEM (chain)\u201d Right click and \u201cSave link as\u201d Use this file for the -c/\u2013certchain option below. Searching for \u201cdownload pem certificate chain [browser]\u201d in a search engine will undoubtedly bring up results for whatever browser you like. Usage usage: dv_ldc_uploader [-h] [-u URL] -k KEY [-d DVS] [-t TSV] [-r] [-n CNAME] [-c CERTCHAIN] [-e EMAIL] [-v] [--version] studies [studies ...] Linguistic Data Consortium metadata uploader for Dataverse. This utility will scrape the metadata from the LDC website (https://catalog.ldc.upenn.edu) and upload data based on a TSV manifest. Please note that this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: studies LDC Catalogue numbers to process, separated by spaces. eg. \"LDC2012T19 LDC2011T07\". Case is ignored, so \"ldc2012T19\" will also work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to \"https://abacus.library.ubc.ca\" -k KEY, --key KEY API key -d DVS, --dvs DVS Short name of target Dataverse collection (eg: ldc). Defaults to \"ldc\" -t TSV, --tsv TSV Manifest tsv file for uploading and metadata. If not supplied, only metadata will be uploaded. Using this option requires only one positional *studies* argument -r, --no-restrict Don't restrict files after upload. -n CNAME, --cname CNAME Study contact name. Default: \"Abacus support\" -c CERTCHAIN, --certchain CERTCHAIN Certificate chain PEM: use if SSL issues are present. The PEM chain must be downloaded with a browser. Default: None -e EMAIL, --email EMAIL Dataverse study contact email address. Default: abacus-support@lists.ubc.ca -v, --verbose Verbose output --version Show version number and exit dv_manifest_gen \u00b6 Not technically a Dataverse-specific script, this utility will generate a tab-separated value output. The file consists of 3 columns: file, description and tags , and optionally a mimetype column. Editing the result and using the upload utility to parse the tsv will add descriptive metadata, tags and file paths to an upload instead of laboriously using the Dataverse GUI. Tags may be separated by commas, eg: \u201cData, SAS, June 2021\u201d. Using stdout and a redirect will also save time. First dump a file as normal. Add other files to the end with different information using the exclude header switch -x and different tags along with output redirection >> . Usage usage: dv_manifest_gen [-h] [-f FILENAME] [-t TAG] [-x] [-r] [-q QUOTE] [-a] [-m] [-p] [--version] [files ...] Creates a file manifest in tab separated value format which can then be edited and used for file uploads to a Dataverse collection. Files can be edited to add file descriptions and comma-separated tags that will be automatically attached to metadata using products using the dataverse_utils library. Will dump to stdout unless -f or --filename is used. Using the command and a dash (ie, \"dv_manifest_gen.py -\" produces full paths for some reason. positional arguments: files Files to add to manifest. Leaving it blank will add all files in the current directory. If using -r will recursively show all. options: -h, --help show this help message and exit -f FILENAME, --filename FILENAME Save to file instead of outputting to stdout -t TAG, --tag TAG Default tag(s). Separate with comma and use quotes if there are spaces. eg. \"Data, June 2021\". Defaults to \"Data\" -x, --no-header Don't include header in output. Useful if creating a complex tsv using redirects (ie, \">>\"). -r, --recursive Recursive listing. -q QUOTE, --quote QUOTE Quote type. Cell value quoting parameters. Options: none (no quotes), min (minimal, ie. special characters only )nonum (non-numeric), all (all cells). Default: min -a, --show-hidden Include hidden files. -m, --mime Include autodetected mimetypes -p, --path Include an optional path column for custom file paths --version Show version number and exit dv_pg_facet_date \u00b6 This specialized tool is designed to be run on the server on which the Dataverse installation exists. When material is published in a Dataverse installation, the \u201cPublication Year\u201d facet in the Dataverse GUI is automatically populated with a date, which is the publication date in that Dataverse installation . This makes sense from the point of view of research data which is first deposited into a Dataverse installation, but fails as a finding aid for either; older data sets that have been migrated and reingested licensed data sets which may have been published years before they were purchased and ingested. For example, if you have a dataset that was published in 1971 but you only added it to your Dataverse installation in 2021, it is not necessarily intuitive to the end user that the \u201cpublication date\u201d in this instance would be 2021. Ideally, you might like it to be 1971. Unfortunately, there is no API-based tool to manage this date. The only way to change it, as of late 2021, is to modify the underlying PostgreSQL database directly with the desired date. Subsequently, the study must be reindexed so that the revised publication date appears as an option in the facet. This tool will perform those operations. However, the tool must be run on the server on which the Dataverse installation exists, as reindexing API calls must be from localhost and database access is necessarily restricted. There are a few other prerequisites for using this tool which differ from the rest of the scripts included in this package. The user must have shell access to the server hosting the Dataverse installation Python 3.6 or higher must be installed The user must possess a valid Dataverse API key The user must know the PostgreSQL password If the database name and user have been changed, the user must know this as well The script requires the manual installation of psycopg2-binary or have a successfully compiled psycopg2 package for Python. See https://www.psycopg.org/docs/ . This is not installed with the normal pip install of the dataverse_utils package as none of the other scripts require it and, in general, the odds of someone using this utility are low. If you forget to install it, the program will politely remind you. This cannot be stressed enough. This tool will directly change values within the PostgreSQL database which holds all of Dataverse\u2019s information . Use this at your own risk; no warranty is implied and no responsibility will be accepted for data loss, etc. If any of the options listed for the utility make no sense to you or sound like gibberish, do not use this tool. Because editing the underlying database may have a high pucker factor for some, there is both a dry-run option and an option to just dump out SQL instead of actually touching anything. These two options do not perform a study reindex and don\u2019t alter the contents of the database. Usage usage: dv_pg_facet_date [-h] [-d DBNAME] [-u USER] -p PASSWORD [-r | -o] [-s] -k KEY [-w URL] [--version] pids [pids ...] {distributionDate,productionDate,dateOfDeposit,dist,prod,dep} A utility to change the 'Production Date' web interface facet in a Dataverse installation to one of the three acceptable date types: 'distributionDate', 'productionDate', or 'dateOfDeposit'. This must be done in the PostgreSQL database directly, so this utility must be run on the *server* that hosts a Dataverse installation. Back up your database if you are unsure. positional arguments: pids persistentIdentifier {distributionDate,productionDate,dateOfDeposit,dist,prod,dep} date type which is to be shown in the facet. The short forms are aliases for the long forms. optional arguments: -h, --help show this help message and exit -d DBNAME, --dbname DBNAME Database name -u USER, --user USER PostgreSQL username -p PASSWORD, --password PASSWORD PostgreSQL password -r, --dry-run print proposed SQL to stdout -o, --sql-only dump sql to file called *pg_sql.sql* in current directory. Appends to file if it exists -s, --save-old Dump old values to tsv called *pg_changed.tsv* in current directory. Appends to file if it exists -k KEY, --key KEY API key for Dataverse installation. -w URL, --url URL URL for base Dataverse installation. Default https://abacus.library.ubc.ca --version Show version number and exit THIS WILL EDIT YOUR POSTGRESQL DATABASE DIRECTLY. USE AT YOUR OWN RISK. dv_record_copy \u00b6 Copies an existing Dataverse study metadata record to a target collection, or replaces a currently existing record. Files are not copied, only the study record. This utility is useful for mateial which is in a series, requiring only minor changes for each iteration. Usage usage: dv_record_copy [-h] [-u URL] -k KEY (-c COLLECTION | -r REPLACE) [-v] pid Record duplicator for Dataverse. This utility will download a Dataverse record And then upload the study level metadata into a new record in a user-specified collection. Please note that this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: pid PID of original dataverse recordseparated by spaces. eg. \"hdl:11272.1/AB2/NOMATH hdl:11272.1/AB2/HANDLE\". Case is ignored, so \"hdl:11272.1/ab2/handle\" will also work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to \"https://abacus.library.ubc.ca\" -k KEY, --key KEY API key -c COLLECTION, --collection COLLECTION Short name of target Dataverse collection (eg: ldc). Defaults to \"statcan-public\" -r REPLACE, --replace REPLACE Replace metadata data in record with this PID -v, --version Show version number and exit dv_release \u00b6 A bulk release utility for Dataverse. This utility will normally be used after a migration or large data transfer, such as a dryad2dataverse transfer from the Dryad data repository. It can release studies individually by persistent ID or just release all unreleased files in a Dataverse. Usage usage: dv_release [-h] [-u URL] -k KEY [-i] [--time STIME] [-v] [-r] [-d DV | -p PID [PID ...]] [--version] Bulk file releaser for unpublished Dataverse studies. Either releases individual studies or all unreleased studies in a single Dataverse collection. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Default: https://abacus.library.ubc.ca -k KEY, --key KEY API key -i, --interactive Manually confirm each release --time STIME, -t STIME Time between release attempts in seconds. Default 10 -v Verbose mode -r, --dry-run Only output a list of studies to be released -d DV, --dv DV Short name of Dataverse collection to process (eg: statcan) -p PID [PID ...], --pid PID [PID ...] Handles or DOIs to release in format hdl:11272.1/FK2/12345 or doi:10.80240/FK2/NWRABI. Multiple values OK --version Show version number and exit dv_replace_licen[cs]e \u00b6 This will replace the text in a record with the text Markdown file. Text is converted to HTML. Optionally, the record can be republished without incrementing the version (ie, with type=updatecurrent . usage: dv_replace_licence [-h] [-u URL] -l LIC -k KEY [-r] [--version] studies [studies ...] Replaces the licence text in a Dataverse study and [optionally] republishes it as the same version. Superuser privileges are required for republishing as the version is not incremented. This software requires the Dataverse installation to be running Dataverse software version >= 5.6. positional arguments: studies Persistent IDs of studies options: -h, --help show this help message and exit -u URL, --url URL Base URL of Dataverse installation. Defaults to \"https://abacus.library.ubc.ca\" -l LIC, --licence LIC Licence file in Markdown format -k KEY, --key KEY Dataverse API key -r, --republish Republish study without incrementing version --version Show version number and exit dv_study_migrator \u00b6 If for some reason you need to copy everything from a Dataverse record to a different Dataverse installation or a different collection, this utility will do it for you. Metadata, file names, paths, restrictions etc will all be copied. There are some limitations, though, as only the most recent version will be copied and date handling is done on the target server. The utility will either copy records specifice with a persistent identifer (PID) to a target collection on the same or another server, or replace records with an existing PID. usage: dv_study_migrator [-h] -s SOURCE_URL -a SOURCE_KEY -t TARGET_URL -b TARGET_KEY [-o TIMEOUT] (-c COLLECTION | -r REPLACE [REPLACE ...]) [-v] pids [pids ...] Record migrator for Dataverse. This utility will take the most recent version of a study from one Dataverse installation and copy the metadata and records to another, completely separate dataverse installation. You could also use it to copy records from one collection to another. positional arguments: pids PID(s) of original Dataverse record(s) in source Dataverse separated by spaces. eg. \"hdl:11272.1/AB2/JEG5RH doi:11272.1/AB2/JEG5RH\". Case is ignored. options: -h, --help show this help message and exit -s SOURCE_URL, --source_url SOURCE_URL Source Dataverse installation base URL. -a SOURCE_KEY, --source_key SOURCE_KEY API key for source Dataverse installation. -t TARGET_URL, --target_url TARGET_URL Source Dataverse installation base URL. -b TARGET_KEY, --target_key TARGET_KEY API key for target Dataverse installation. -o TIMEOUT, --timeout TIMEOUT Request timeout in seconds. Default 100. -c COLLECTION, --collection COLLECTION Short name of target Dataverse collection (eg: dli). -r REPLACE [REPLACE ...], --replace REPLACE [REPLACE ...] Replace data in these target PIDs with data from the source PIDS. Number of PIDs listed here must match the number of PID arguments to follow. That is, the number of records must be equal. Records will be matched on a 1-1 basis in order. For example: [rest of command] -r doi:123.34/etc hdl:12323/AB/SOMETHI will replace the record with identifier 'doi' with the data from 'hdl'. Make sure you don't use this as the penultimate switch, because then it's not possible to disambiguate PIDS from this argument and positional arguments. ie, something like dv_study_migrator -r blah blah -s http//test.invalid etc. -v, --version Show version number and exit dv_upload_tsv \u00b6 Now that you have a tsv full of nicely described data, you can easily upload it to an existing study if you know the persistent ID and have an API key. For the best metadata, you should probably edit it manually to add correct descriptive metadata, notably the \u201cDescription\u201d and \u201cTags\u201d. Tags are split separated by commas, so it\u2019s possible to have multiple tags for each data item, like \u201cData, SPSS, June 2021\u201d. File paths are automatically generated from the \u201cfile\u201d column. Because of this, you should probably use relative paths rather than absolute paths unless you want to have a lengthy path string in Dataverse. If uploading a tsv which includes mimetypes, be aware that mimetypes for zip files will be ignored to circumvent Dataverse\u2019s automatic unzipping feature. The rationale for manually specifiying mimetypes is to enable the use of previews which require a specific mimetype to function, but Dataverse does not correctly detect the type. For example, the GeoJSON file previewer requires a mimetype of application/geo+json , but the detection of this mimetype is not supported until Dataverse v5.9. By manually setting the mimetype, the previewer can be used by earlier Dataverse versions. Usage usage: dv_upload_tsv [-h] -p PID -k KEY [-u URL] [-r] [-n] [-t TRUNCATE] [-o] [-v] tsv Uploads data sets to an *existing* Dataverse study from the contents of a TSV (tab separated value) file. Metadata, file tags, paths, etc are all read from the TSV. JSON output from the Dataverse API is printed to stdout during the process. By default, files will be unrestricted but the utility will ask for confirmation before uploading. positional arguments: tsv TSV file to upload options: -h, --help show this help message and exit -p PID, --pid PID Dataverse study persistent identifier (DOI/handle) -k KEY, --key KEY API key -u URL, --url URL Dataverse installation base url. defaults to \"https://abacus.library.ubc.ca\" -r, --restrict Restrict files after upload. -n, --no-confirm Don't confirm non-restricted status -t TRUNCATE, --truncate TRUNCATE Left truncate file path. As Dataverse studies can retain directory structure, you can set an arbitrary starting point by removing the leftmost portion. Eg: if the TSV has a file path of /home/user/Data/file.txt, setting --truncate to \"/home/user\" would have file.txt in the Data directory in the Dataverse study. The file is still loaded from the path in the spreadsheet. Defaults to no truncation. -o, --override Disables replacement of mimetypes for Dataverse- processable files. That is, files such as Excel, SPSS, etc, will have their actual mimetypes sent instead of 'application/octet-stream'. Useful when mimetypes are specified in the TSV file and the upload mimetype is not the expected result. -v, --version Show version number and exit Notes for Windows users \u00b6 Command line scripts for Python may not necessarily behave the way they do in Linux/Mac, depending on how you access them. For detailed information on Windows systems, please see the Windows testing document","title":"Console utilities"},{"location":"scripts/#console-utilities","text":"code { white-space : pre-wrap !important; } These utilities are available at the command line/command prompt and don\u2019t require any Python knowledge except how to install a Python library via pip, as outlined in the overview document. Once installed via pip, the scripts will be available via the command line and will not require calling Python explicitly. That is, they can be called from the command line directly. For example: dv_tsv_manifest is all you will need to type. Note that these programs have been primarily tested on Linux and MacOS, with Windows a tertiary priority . Windows is notable for its unusual file handling, so, as the MIT licence stipulates, there is no warranty as to the suitability for a particular purpose. In alphabetical order:","title":"Console utilities"},{"location":"scripts/#dv_del","text":"This is bulk deletion utility for unpublished studies (or even single studies). It\u2019s useful when your automated procedures have gone wrong, or if you don\u2019t feel like navigating through many menus. Note the -i switch which can ask for manual confirmation of deletions. Usage usage: dv_del [-h] -k KEY [-d DATAVERSE | -p PID] [-i] [-u DVURL] [--version] Delete draft studies from a Dataverse collection options: -h, --help show this help message and exit -k KEY, --key KEY Dataverse user API key -d DATAVERSE, --dataverse DATAVERSE Dataverse collection short name from which to delete all draft records. eg. \"ldc\" -p PID, --persistentId PID Handle or DOI to delete in format hdl:11272.1/FK2/12345 -i, --interactive Confirm each study deletion -u DVURL, --url DVURL URL to base Dataverse installation --version Show version number and exit","title":"dv_del"},{"location":"scripts/#dv_ldc_uploader","text":"This is a very specialized utility which will scrape metadata from the Linguistic Data Consortium (LDC) and create a metadata record in a Dataverse. The LDC does not have an API, so the metadata is scraped from their web site. This means that the metadata may not be quite as controlled as that which comes from an API. Data from the LDC website is converted to Dryad -style JSON via dataverse_utils.ldc via the use of the dryad2dataverse library. There are two main methods of use for this utility: Multiple metadata uploads. Multiple LDC record numbers can be supplied and a study without files will be created for each one. If a TSV file with file information is upplied via the -t or --tsv switch, the utility will upload a single LDC study and upload the contents of the tsv file to the created record.","title":"dv_ldc_uploader"},{"location":"scripts/#important-note","text":"2024-09 Update The problem listed below seems to have resolved itself by September 2024. It\u2019s not clear whether this was a certifi issue or an issue with LDC\u2019s certificates. In any case, if you are having problems with LDC website, use the -c switch and follow the procedure below. As of early 2023, the LDC website is not supported by certifi . You will need to manually supply a certificate chain to use the utility. To obtain the certificate chain (in Firefox) perform the following steps: Select Tools/Page Info In the Security tab, select View Certificate Scroll to \u201cPEM (chain)\u201d Right click and \u201cSave link as\u201d Use this file for the -c/\u2013certchain option below. Searching for \u201cdownload pem certificate chain [browser]\u201d in a search engine will undoubtedly bring up results for whatever browser you like. Usage usage: dv_ldc_uploader [-h] [-u URL] -k KEY [-d DVS] [-t TSV] [-r] [-n CNAME] [-c CERTCHAIN] [-e EMAIL] [-v] [--version] studies [studies ...] Linguistic Data Consortium metadata uploader for Dataverse. This utility will scrape the metadata from the LDC website (https://catalog.ldc.upenn.edu) and upload data based on a TSV manifest. Please note that this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: studies LDC Catalogue numbers to process, separated by spaces. eg. \"LDC2012T19 LDC2011T07\". Case is ignored, so \"ldc2012T19\" will also work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to \"https://abacus.library.ubc.ca\" -k KEY, --key KEY API key -d DVS, --dvs DVS Short name of target Dataverse collection (eg: ldc). Defaults to \"ldc\" -t TSV, --tsv TSV Manifest tsv file for uploading and metadata. If not supplied, only metadata will be uploaded. Using this option requires only one positional *studies* argument -r, --no-restrict Don't restrict files after upload. -n CNAME, --cname CNAME Study contact name. Default: \"Abacus support\" -c CERTCHAIN, --certchain CERTCHAIN Certificate chain PEM: use if SSL issues are present. The PEM chain must be downloaded with a browser. Default: None -e EMAIL, --email EMAIL Dataverse study contact email address. Default: abacus-support@lists.ubc.ca -v, --verbose Verbose output --version Show version number and exit","title":"Important note"},{"location":"scripts/#dv_manifest_gen","text":"Not technically a Dataverse-specific script, this utility will generate a tab-separated value output. The file consists of 3 columns: file, description and tags , and optionally a mimetype column. Editing the result and using the upload utility to parse the tsv will add descriptive metadata, tags and file paths to an upload instead of laboriously using the Dataverse GUI. Tags may be separated by commas, eg: \u201cData, SAS, June 2021\u201d. Using stdout and a redirect will also save time. First dump a file as normal. Add other files to the end with different information using the exclude header switch -x and different tags along with output redirection >> . Usage usage: dv_manifest_gen [-h] [-f FILENAME] [-t TAG] [-x] [-r] [-q QUOTE] [-a] [-m] [-p] [--version] [files ...] Creates a file manifest in tab separated value format which can then be edited and used for file uploads to a Dataverse collection. Files can be edited to add file descriptions and comma-separated tags that will be automatically attached to metadata using products using the dataverse_utils library. Will dump to stdout unless -f or --filename is used. Using the command and a dash (ie, \"dv_manifest_gen.py -\" produces full paths for some reason. positional arguments: files Files to add to manifest. Leaving it blank will add all files in the current directory. If using -r will recursively show all. options: -h, --help show this help message and exit -f FILENAME, --filename FILENAME Save to file instead of outputting to stdout -t TAG, --tag TAG Default tag(s). Separate with comma and use quotes if there are spaces. eg. \"Data, June 2021\". Defaults to \"Data\" -x, --no-header Don't include header in output. Useful if creating a complex tsv using redirects (ie, \">>\"). -r, --recursive Recursive listing. -q QUOTE, --quote QUOTE Quote type. Cell value quoting parameters. Options: none (no quotes), min (minimal, ie. special characters only )nonum (non-numeric), all (all cells). Default: min -a, --show-hidden Include hidden files. -m, --mime Include autodetected mimetypes -p, --path Include an optional path column for custom file paths --version Show version number and exit","title":"dv_manifest_gen"},{"location":"scripts/#dv_pg_facet_date","text":"This specialized tool is designed to be run on the server on which the Dataverse installation exists. When material is published in a Dataverse installation, the \u201cPublication Year\u201d facet in the Dataverse GUI is automatically populated with a date, which is the publication date in that Dataverse installation . This makes sense from the point of view of research data which is first deposited into a Dataverse installation, but fails as a finding aid for either; older data sets that have been migrated and reingested licensed data sets which may have been published years before they were purchased and ingested. For example, if you have a dataset that was published in 1971 but you only added it to your Dataverse installation in 2021, it is not necessarily intuitive to the end user that the \u201cpublication date\u201d in this instance would be 2021. Ideally, you might like it to be 1971. Unfortunately, there is no API-based tool to manage this date. The only way to change it, as of late 2021, is to modify the underlying PostgreSQL database directly with the desired date. Subsequently, the study must be reindexed so that the revised publication date appears as an option in the facet. This tool will perform those operations. However, the tool must be run on the server on which the Dataverse installation exists, as reindexing API calls must be from localhost and database access is necessarily restricted. There are a few other prerequisites for using this tool which differ from the rest of the scripts included in this package. The user must have shell access to the server hosting the Dataverse installation Python 3.6 or higher must be installed The user must possess a valid Dataverse API key The user must know the PostgreSQL password If the database name and user have been changed, the user must know this as well The script requires the manual installation of psycopg2-binary or have a successfully compiled psycopg2 package for Python. See https://www.psycopg.org/docs/ . This is not installed with the normal pip install of the dataverse_utils package as none of the other scripts require it and, in general, the odds of someone using this utility are low. If you forget to install it, the program will politely remind you. This cannot be stressed enough. This tool will directly change values within the PostgreSQL database which holds all of Dataverse\u2019s information . Use this at your own risk; no warranty is implied and no responsibility will be accepted for data loss, etc. If any of the options listed for the utility make no sense to you or sound like gibberish, do not use this tool. Because editing the underlying database may have a high pucker factor for some, there is both a dry-run option and an option to just dump out SQL instead of actually touching anything. These two options do not perform a study reindex and don\u2019t alter the contents of the database. Usage usage: dv_pg_facet_date [-h] [-d DBNAME] [-u USER] -p PASSWORD [-r | -o] [-s] -k KEY [-w URL] [--version] pids [pids ...] {distributionDate,productionDate,dateOfDeposit,dist,prod,dep} A utility to change the 'Production Date' web interface facet in a Dataverse installation to one of the three acceptable date types: 'distributionDate', 'productionDate', or 'dateOfDeposit'. This must be done in the PostgreSQL database directly, so this utility must be run on the *server* that hosts a Dataverse installation. Back up your database if you are unsure. positional arguments: pids persistentIdentifier {distributionDate,productionDate,dateOfDeposit,dist,prod,dep} date type which is to be shown in the facet. The short forms are aliases for the long forms. optional arguments: -h, --help show this help message and exit -d DBNAME, --dbname DBNAME Database name -u USER, --user USER PostgreSQL username -p PASSWORD, --password PASSWORD PostgreSQL password -r, --dry-run print proposed SQL to stdout -o, --sql-only dump sql to file called *pg_sql.sql* in current directory. Appends to file if it exists -s, --save-old Dump old values to tsv called *pg_changed.tsv* in current directory. Appends to file if it exists -k KEY, --key KEY API key for Dataverse installation. -w URL, --url URL URL for base Dataverse installation. Default https://abacus.library.ubc.ca --version Show version number and exit THIS WILL EDIT YOUR POSTGRESQL DATABASE DIRECTLY. USE AT YOUR OWN RISK.","title":"dv_pg_facet_date"},{"location":"scripts/#dv_record_copy","text":"Copies an existing Dataverse study metadata record to a target collection, or replaces a currently existing record. Files are not copied, only the study record. This utility is useful for mateial which is in a series, requiring only minor changes for each iteration. Usage usage: dv_record_copy [-h] [-u URL] -k KEY (-c COLLECTION | -r REPLACE) [-v] pid Record duplicator for Dataverse. This utility will download a Dataverse record And then upload the study level metadata into a new record in a user-specified collection. Please note that this utility was built with the Abacus repository (https://abacus.library.ubc.ca) in mind, so many of the defaults are specific to that Dataverse installation. positional arguments: pid PID of original dataverse recordseparated by spaces. eg. \"hdl:11272.1/AB2/NOMATH hdl:11272.1/AB2/HANDLE\". Case is ignored, so \"hdl:11272.1/ab2/handle\" will also work. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Defaults to \"https://abacus.library.ubc.ca\" -k KEY, --key KEY API key -c COLLECTION, --collection COLLECTION Short name of target Dataverse collection (eg: ldc). Defaults to \"statcan-public\" -r REPLACE, --replace REPLACE Replace metadata data in record with this PID -v, --version Show version number and exit","title":"dv_record_copy"},{"location":"scripts/#dv_release","text":"A bulk release utility for Dataverse. This utility will normally be used after a migration or large data transfer, such as a dryad2dataverse transfer from the Dryad data repository. It can release studies individually by persistent ID or just release all unreleased files in a Dataverse. Usage usage: dv_release [-h] [-u URL] -k KEY [-i] [--time STIME] [-v] [-r] [-d DV | -p PID [PID ...]] [--version] Bulk file releaser for unpublished Dataverse studies. Either releases individual studies or all unreleased studies in a single Dataverse collection. options: -h, --help show this help message and exit -u URL, --url URL Dataverse installation base URL. Default: https://abacus.library.ubc.ca -k KEY, --key KEY API key -i, --interactive Manually confirm each release --time STIME, -t STIME Time between release attempts in seconds. Default 10 -v Verbose mode -r, --dry-run Only output a list of studies to be released -d DV, --dv DV Short name of Dataverse collection to process (eg: statcan) -p PID [PID ...], --pid PID [PID ...] Handles or DOIs to release in format hdl:11272.1/FK2/12345 or doi:10.80240/FK2/NWRABI. Multiple values OK --version Show version number and exit","title":"dv_release"},{"location":"scripts/#dv_replace_licencse","text":"This will replace the text in a record with the text Markdown file. Text is converted to HTML. Optionally, the record can be republished without incrementing the version (ie, with type=updatecurrent . usage: dv_replace_licence [-h] [-u URL] -l LIC -k KEY [-r] [--version] studies [studies ...] Replaces the licence text in a Dataverse study and [optionally] republishes it as the same version. Superuser privileges are required for republishing as the version is not incremented. This software requires the Dataverse installation to be running Dataverse software version >= 5.6. positional arguments: studies Persistent IDs of studies options: -h, --help show this help message and exit -u URL, --url URL Base URL of Dataverse installation. Defaults to \"https://abacus.library.ubc.ca\" -l LIC, --licence LIC Licence file in Markdown format -k KEY, --key KEY Dataverse API key -r, --republish Republish study without incrementing version --version Show version number and exit","title":"dv_replace_licen[cs]e"},{"location":"scripts/#dv_study_migrator","text":"If for some reason you need to copy everything from a Dataverse record to a different Dataverse installation or a different collection, this utility will do it for you. Metadata, file names, paths, restrictions etc will all be copied. There are some limitations, though, as only the most recent version will be copied and date handling is done on the target server. The utility will either copy records specifice with a persistent identifer (PID) to a target collection on the same or another server, or replace records with an existing PID. usage: dv_study_migrator [-h] -s SOURCE_URL -a SOURCE_KEY -t TARGET_URL -b TARGET_KEY [-o TIMEOUT] (-c COLLECTION | -r REPLACE [REPLACE ...]) [-v] pids [pids ...] Record migrator for Dataverse. This utility will take the most recent version of a study from one Dataverse installation and copy the metadata and records to another, completely separate dataverse installation. You could also use it to copy records from one collection to another. positional arguments: pids PID(s) of original Dataverse record(s) in source Dataverse separated by spaces. eg. \"hdl:11272.1/AB2/JEG5RH doi:11272.1/AB2/JEG5RH\". Case is ignored. options: -h, --help show this help message and exit -s SOURCE_URL, --source_url SOURCE_URL Source Dataverse installation base URL. -a SOURCE_KEY, --source_key SOURCE_KEY API key for source Dataverse installation. -t TARGET_URL, --target_url TARGET_URL Source Dataverse installation base URL. -b TARGET_KEY, --target_key TARGET_KEY API key for target Dataverse installation. -o TIMEOUT, --timeout TIMEOUT Request timeout in seconds. Default 100. -c COLLECTION, --collection COLLECTION Short name of target Dataverse collection (eg: dli). -r REPLACE [REPLACE ...], --replace REPLACE [REPLACE ...] Replace data in these target PIDs with data from the source PIDS. Number of PIDs listed here must match the number of PID arguments to follow. That is, the number of records must be equal. Records will be matched on a 1-1 basis in order. For example: [rest of command] -r doi:123.34/etc hdl:12323/AB/SOMETHI will replace the record with identifier 'doi' with the data from 'hdl'. Make sure you don't use this as the penultimate switch, because then it's not possible to disambiguate PIDS from this argument and positional arguments. ie, something like dv_study_migrator -r blah blah -s http//test.invalid etc. -v, --version Show version number and exit","title":"dv_study_migrator"},{"location":"scripts/#dv_upload_tsv","text":"Now that you have a tsv full of nicely described data, you can easily upload it to an existing study if you know the persistent ID and have an API key. For the best metadata, you should probably edit it manually to add correct descriptive metadata, notably the \u201cDescription\u201d and \u201cTags\u201d. Tags are split separated by commas, so it\u2019s possible to have multiple tags for each data item, like \u201cData, SPSS, June 2021\u201d. File paths are automatically generated from the \u201cfile\u201d column. Because of this, you should probably use relative paths rather than absolute paths unless you want to have a lengthy path string in Dataverse. If uploading a tsv which includes mimetypes, be aware that mimetypes for zip files will be ignored to circumvent Dataverse\u2019s automatic unzipping feature. The rationale for manually specifiying mimetypes is to enable the use of previews which require a specific mimetype to function, but Dataverse does not correctly detect the type. For example, the GeoJSON file previewer requires a mimetype of application/geo+json , but the detection of this mimetype is not supported until Dataverse v5.9. By manually setting the mimetype, the previewer can be used by earlier Dataverse versions. Usage usage: dv_upload_tsv [-h] -p PID -k KEY [-u URL] [-r] [-n] [-t TRUNCATE] [-o] [-v] tsv Uploads data sets to an *existing* Dataverse study from the contents of a TSV (tab separated value) file. Metadata, file tags, paths, etc are all read from the TSV. JSON output from the Dataverse API is printed to stdout during the process. By default, files will be unrestricted but the utility will ask for confirmation before uploading. positional arguments: tsv TSV file to upload options: -h, --help show this help message and exit -p PID, --pid PID Dataverse study persistent identifier (DOI/handle) -k KEY, --key KEY API key -u URL, --url URL Dataverse installation base url. defaults to \"https://abacus.library.ubc.ca\" -r, --restrict Restrict files after upload. -n, --no-confirm Don't confirm non-restricted status -t TRUNCATE, --truncate TRUNCATE Left truncate file path. As Dataverse studies can retain directory structure, you can set an arbitrary starting point by removing the leftmost portion. Eg: if the TSV has a file path of /home/user/Data/file.txt, setting --truncate to \"/home/user\" would have file.txt in the Data directory in the Dataverse study. The file is still loaded from the path in the spreadsheet. Defaults to no truncation. -o, --override Disables replacement of mimetypes for Dataverse- processable files. That is, files such as Excel, SPSS, etc, will have their actual mimetypes sent instead of 'application/octet-stream'. Useful when mimetypes are specified in the TSV file and the upload mimetype is not the expected result. -v, --version Show version number and exit","title":"dv_upload_tsv"},{"location":"scripts/#notes-for-windows-users","text":"Command line scripts for Python may not necessarily behave the way they do in Linux/Mac, depending on how you access them. For detailed information on Windows systems, please see the Windows testing document","title":"Notes for Windows users"},{"location":"windows/","text":"Running the dataverse_utils console utilities under Windows \u00b6 On Mac and Linux, running the scripts supplied with dataverse_utils is straightforward. They\u2019re available at the command line, which means that you can simply run them by (for example): $ dv_manifest_gen.py followed by switches and variables as normal. Doing this results in output to the terminal window. This is not necessarily the case in Windows . Whether or not the utility appears on the Windows command line will likely depend on the shell you installed it with: Commonly used shells on Windows include, but are not limited to: Command prompt (cmd.exe) PowerShell Git bash Cygwin If the utilities are not functioning the way you are expecting, make sure that Python and the install location is in your PATH. As of version 0.8.3 the installation has been updated to use newer packaging standards which will ideally reduce the frequency of installation problems. Also as of v0.8.3, the .py suffix has been removed from the console utilities. This means if you are forced to run a command manually, it would be run with python [utilityname] not python [utilityname.py] Troubleshooting \u00b6 These are (likely deprecated) notes from testing on a variety of Windows installations. If you\u2019re luckly, a solution can be found below. This test case uses a new installation of https://python.org Python, v.3.9.6, installed in Windows using the GUI, so it\u2019s as basic a Windows installation as you can get. In this instance, dataverse_utils were installed using pip from the PowerShell, ie pip install git+https://github.com/ubc-library-rc/dataverse_utils . However, pip should be pip regardless of which console you use to install. Here\u2019s a handy guide to show the results of how/if the command line scripts run. This example uses dv_manifest.gen.py , but appears to be generally applicable to any scripts configured with setuptools.setup() (ie, setuptools.setup(scripts=[whatever] ). If this means nothing to you because you\u2019re not distributing your own Python packages,, just skip to the table below. Windows Terminal type \u00b6 PowerShell \u00b6 Note that on these tests the user is not an administrator . Administrator results, in all likelihood, will be completely different, ideally better. Problem Attempting to run the script results in a window popping up for a nanosecond and no output. Solution This may not occur if the PowerShell is run as an administrator. What is happening here is that the script is running, but it\u2019s showing up in a separate window. Output can be created as normal, if you use the correct switches. Unfortunately, you won\u2019t be able to see what they are, because the popup window disappears, which is not helpful. There are three potential fixes. If you can run PowerShell as an administrator, that may solve the problem. Edit the PATHEXT environment variable to include the .py extension. Note that if the user PATHEXT is edited, the system will ignore the system PATHEXT, meaning that things like .exe files won\u2019t run unless the full name is typed (eg. \u2018notepad.exe\u2019). So, if editing the user PATHEXT, make sure to include the system PATHEXT and append ;.PY to the string. Edit the PATHEXT for PowerShell itself, rather than on a system wide level. Editing $PROFILE to include the .py extension should allow the Python script to run within PowerShell. For instructions, see https://docs.microsoft.com/en-ca/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.1 . Create a profile as per How to create a profile Within that profile, $env:PATHEXT += \";.py\" Depending on the nature of your Windows installation, this may be disabled by the security policy, in which case you can also try the method above. Command prompt \u00b6 This is the traditional Windows command prompt (ie, cmd.exe ). The scripts should just work after being installed with pip, as this installation is the default. For example, run with: C:\\>dv_manifest_gen.py [arguments] Obviously it don\u2019t type the C:\\> part. SSH session \u00b6 If using the built-in Windows SSH server, scripts should simply run as per the command prompt above. Windows SSH sessions default to using the Windows command prompt, not bash. Bash sessions under SSH should function if Bash is configured as below. Git Bash \u00b6 Git Bash is part of the git suite available here: https://git-scm.com/downloads . There are a few notable wrinkles with for use with Python. During installation of Git After v2.32.0.2 (and possibly earlier), you will have the option during the installation to \u201cEnable experimental support for pseudo consoles\u201d. Doing this will allow you run Python directly from the bash shell like you would normally, and the scripts should function as per the command prompt above. As a bonus, enabling this feature seems to fix errors with pipes which formerly resulted in the stdout is not a tty error when piping shell output (for instance, to grep ). If you have not checked this box, you will need to add an alias to your .bashrc and/or .bash_profile : alias python='winpty python' alias pip='winpty pip' Either that, or you will need to start Python with winpty python , which is annoying. Similarly winpty pip . Even if you have not enabled pseudo-console support and didn\u2019t complete use option 2, the scripts should still function normally though. Having scripts work but Python not work is not optimal and confusing, so a solution is there even though it technically isn\u2019t required. There are many options for Git Bash installation; testing has not covered all possible permutations of installation options.","title":"Windows notes"},{"location":"windows/#running-the-dataverse_utils-console-utilities-under-windows","text":"On Mac and Linux, running the scripts supplied with dataverse_utils is straightforward. They\u2019re available at the command line, which means that you can simply run them by (for example): $ dv_manifest_gen.py followed by switches and variables as normal. Doing this results in output to the terminal window. This is not necessarily the case in Windows . Whether or not the utility appears on the Windows command line will likely depend on the shell you installed it with: Commonly used shells on Windows include, but are not limited to: Command prompt (cmd.exe) PowerShell Git bash Cygwin If the utilities are not functioning the way you are expecting, make sure that Python and the install location is in your PATH. As of version 0.8.3 the installation has been updated to use newer packaging standards which will ideally reduce the frequency of installation problems. Also as of v0.8.3, the .py suffix has been removed from the console utilities. This means if you are forced to run a command manually, it would be run with python [utilityname] not python [utilityname.py]","title":"Running the dataverse_utils console utilities under Windows"},{"location":"windows/#troubleshooting","text":"These are (likely deprecated) notes from testing on a variety of Windows installations. If you\u2019re luckly, a solution can be found below. This test case uses a new installation of https://python.org Python, v.3.9.6, installed in Windows using the GUI, so it\u2019s as basic a Windows installation as you can get. In this instance, dataverse_utils were installed using pip from the PowerShell, ie pip install git+https://github.com/ubc-library-rc/dataverse_utils . However, pip should be pip regardless of which console you use to install. Here\u2019s a handy guide to show the results of how/if the command line scripts run. This example uses dv_manifest.gen.py , but appears to be generally applicable to any scripts configured with setuptools.setup() (ie, setuptools.setup(scripts=[whatever] ). If this means nothing to you because you\u2019re not distributing your own Python packages,, just skip to the table below.","title":"Troubleshooting"},{"location":"windows/#windows-terminal-type","text":"","title":"Windows Terminal type"},{"location":"windows/#powershell","text":"Note that on these tests the user is not an administrator . Administrator results, in all likelihood, will be completely different, ideally better. Problem Attempting to run the script results in a window popping up for a nanosecond and no output. Solution This may not occur if the PowerShell is run as an administrator. What is happening here is that the script is running, but it\u2019s showing up in a separate window. Output can be created as normal, if you use the correct switches. Unfortunately, you won\u2019t be able to see what they are, because the popup window disappears, which is not helpful. There are three potential fixes. If you can run PowerShell as an administrator, that may solve the problem. Edit the PATHEXT environment variable to include the .py extension. Note that if the user PATHEXT is edited, the system will ignore the system PATHEXT, meaning that things like .exe files won\u2019t run unless the full name is typed (eg. \u2018notepad.exe\u2019). So, if editing the user PATHEXT, make sure to include the system PATHEXT and append ;.PY to the string. Edit the PATHEXT for PowerShell itself, rather than on a system wide level. Editing $PROFILE to include the .py extension should allow the Python script to run within PowerShell. For instructions, see https://docs.microsoft.com/en-ca/powershell/module/microsoft.powershell.core/about/about_profiles?view=powershell-7.1 . Create a profile as per How to create a profile Within that profile, $env:PATHEXT += \";.py\" Depending on the nature of your Windows installation, this may be disabled by the security policy, in which case you can also try the method above.","title":"PowerShell"},{"location":"windows/#command-prompt","text":"This is the traditional Windows command prompt (ie, cmd.exe ). The scripts should just work after being installed with pip, as this installation is the default. For example, run with: C:\\>dv_manifest_gen.py [arguments] Obviously it don\u2019t type the C:\\> part.","title":"Command prompt"},{"location":"windows/#ssh-session","text":"If using the built-in Windows SSH server, scripts should simply run as per the command prompt above. Windows SSH sessions default to using the Windows command prompt, not bash. Bash sessions under SSH should function if Bash is configured as below.","title":"SSH session"},{"location":"windows/#git-bash","text":"Git Bash is part of the git suite available here: https://git-scm.com/downloads . There are a few notable wrinkles with for use with Python. During installation of Git After v2.32.0.2 (and possibly earlier), you will have the option during the installation to \u201cEnable experimental support for pseudo consoles\u201d. Doing this will allow you run Python directly from the bash shell like you would normally, and the scripts should function as per the command prompt above. As a bonus, enabling this feature seems to fix errors with pipes which formerly resulted in the stdout is not a tty error when piping shell output (for instance, to grep ). If you have not checked this box, you will need to add an alias to your .bashrc and/or .bash_profile : alias python='winpty python' alias pip='winpty pip' Either that, or you will need to start Python with winpty python , which is annoying. Similarly winpty pip . Even if you have not enabled pseudo-console support and didn\u2019t complete use option 2, the scripts should still function normally though. Having scripts work but Python not work is not optimal and confusing, so a solution is there even though it technically isn\u2019t required. There are many options for Git Bash installation; testing has not covered all possible permutations of installation options.","title":"Git Bash"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 9a7837c53836e1818e581a0969a54e00094e9269..965496402942975cc647ec45d7cc29b8d1d1a849 100644 GIT binary patch delta 14 Vcmb=g=aBE_;Lu(ACT$`|IRGN11oZ#_ delta 14 Vcmb=g=aBE_;E>*XKXoEUIRGMZ1nmF- diff --git a/windows/index.html b/windows/index.html index 5aba2c1..8b2ea0e 100644 --- a/windows/index.html +++ b/windows/index.html @@ -8,7 +8,7 @@ Windows notes - dataverse_utils - + - - - + + @@ -93,8 +92,8 @@